マグネテック備忘録

Flutterアプリ開発の備忘録

【Flutter】録音(record)



recordパッケージについて



パッケージの追加

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()) {
  // 権限がある場合の処理
}



start

  • 録音を開始する。
  • 第二引数に保存したいパスを設定
await record.start(const RecordConfig(), path: "保存したいパス");



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('録音した音声を再生'),
            ),
          ],
        ),
      ),
    );
  }
}