パッケージの追加
dependencies: record: ^5.0.4
権限の追加
アプリがマイク機能を使用する権限を取得できるようにします。
android/app/src/main/AndroidManifest.xml
manifestの間に以下のコードを追加
<uses-permission android:name="android.permission.RECORD_AUDIO" />
android/app/build.gradle
このままだと
AndroidManifest.xml as the library might be using APIs not available in 19 Suggestion: use a compatible library with a minSdk of at most 19,
というエラーが出るので、以下のように変更して対策
参考:【Flutter】Firebaseを導入したときのバージョンのエラー解決(firebaseのことを言っているが原理は同じ)。
defaultConfig { // minSdkVersion flutter.minSdkVersion minSdkVersion 21 }
AudioRecorderクラス
基本的にこのクラスを使って録音をする
宣言
AudioRecorder record = AudioRecorder();
hasPermission
- 端末のマイクを使う権限の有無を判定する。
- 権限がない場合は以下の画面で権限を与えるかどうかを選択できる。
- 返り値がFuture
なのでif文などと一緒に使う。
if (await record.hasPermission()) { // 権限がある場合の処理 }
stop
- 録音を終了します。
- 返り値がFuture
で保存したパスを取得できます。 - これを呼び出した後に、dispose関数も呼ぶとよいそうです。
final path = await record.stop(); ecord.dispose();
デモアプリ
- 保存パスはpath_provider、録音した音声の再生はaudioplayersで行うので、パッケージを追加します。
dependencies: record: ^5.0.4 audioplayers: ^5.2.1 path_provider: ^2.1.2
ソースコード
import 'package:flutter/material.dart'; import 'package:record/record.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:path_provider/path_provider.dart'; AudioRecorder record = AudioRecorder(); final player = AudioPlayer(); String? path = ''; void main() async { WidgetsFlutterBinding.ensureInitialized(); // この行を追加 final directory = await getApplicationCacheDirectory(); path = '${directory.path}/test.mp3'; // print(path); final app = MaterialApp( home: MyApp(), ); runApp(app); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: const Text('Record Test'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ // 録音開始ボタン TextButton( onPressed: () async{ // インスタンス作成 record = AudioRecorder(); // 権限の有無を判定 if (await record.hasPermission()) { await record.start(const RecordConfig(), path: path!); } }, child: const Text('録音開始'), ), // 録音停止ボタン TextButton( onPressed: () async{ final path = await record.stop(); debugPrint('保存先:${path!}'); record.dispose(); }, child: const Text('録音停止'), ), // 再生ボタン TextButton( onPressed: () { // 再生 Source urlSource = UrlSource(path!); player.play(urlSource); }, child: const Text('録音した音声を再生'), ), ], ), ), ); } }