🎶

【Flutter】simple_audio を試す

2025/02/24に公開

概要

今回は以下のパッケージを試してみたいと思います。パッと試すだけなのでAndroidのみで試しています。

https://pub.dev/packages/simple_audio

  • できるだけシンプルに、コア機能のみ (例: 再生/一時停止) を提供
  • 安定性と比較的バグのない状態を目指している

パッケージを見てみるとコア部分がRustを使って実装されています。
シンプルに音を鳴らすことに特化したパッケージを目指しているという事なので、実際に試してみたいと思います。

インストール

以下コマンドを実施して追加するか

flutter pub add simple_audio

pubspec.yaml に以下を追加します。

dependencies:
  simple_audio: ^2.0.4

次にサンプル実装に必要なパッケージもインストールしておきます。今回 file_pickerpermission_handler を使います

flutter pub add file_picker permission_handler
dependencies:
  file_picker: ^8.1.7
  permission_handler: ^11.3.1

シンプルな実装

今回はmp3ファイルを鳴らすだけの実装を試してみたいと思います。Flutterプロジェクトを新規作成し、main.dart のエントリーポイント部分を以下のように修正します。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await SimpleAudio.init(); // ← 追加
  // ....
}

次に android/app/src/main/AndroidManifest.xml に以下 Permission を追加します。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

次に SimpleAudioSample.dart ファイルを以下内容で作成し、アプリ内でこちらの画面を表示するように実装します。

import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:simple_audio/simple_audio.dart';

class SimpleAudioSample extends StatelessWidget {
  const SimpleAudioSample({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Simple Audio')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
       // ①
            var status = await Permission.audio.status;
            if (!status.isGranted) {
              status = await Permission.audio.request();
            }
            if (status.isDenied) {
              return;
            }
            // ②
            final path = await pickFile();
            if (path == null) {
              return;
            }
            // ③
            final SimpleAudio player =
                SimpleAudio(shouldNormalizeVolume: false);
            await player.stop();
            await player.open(path);
          },
          child: const Text('Play sound'),
        ),
      ),
    );
  }

  Future<String?> pickFile() async {
    FilePickerResult? file = await FilePicker.platform
        .pickFiles(dialogTitle: "Pick file to play.", type: FileType.audio);

    final PlatformFile? pickedFile = file?.files.single;
    return pickedFile?.path;
  }
}
  • ① : Permissionチェック
      - 以前は permission_handler パッケージのPermission.storageREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE に紐づいていましたが、Android 10 (API 29)から非推奨、Android 13 (API 33)では削除されています
      - 代わりに READ_MEDIA_IMAGES READ_MEDIA_VIDEO READ_MEDIA_AUDIO を使用する様になりました
      - それぞれ Permission.photos Permission.videos Permission.audio に紐づいています
      - 今回はAudioのみなので Permission.audio を使用しています
      - ※ compileSdkVersionが33以上の設定が必要

https://source.android.com/docs/core/storage?hl=ja

  • ② : Audioファイル読み込み
      - file_pickerパッケージを使用して、Audioファイルを読み込んでいます

  • ③ : Audioファイルの再生
      - 今回のメインの処理になります
      - SimpleAudioのPlayerを初期化して、Audioファイルのパスを与えています
      - open を実施するとデフォルトで自動再生されます

👇シュミレータで実行すると音が再生されるかと思います。(gifなので雰囲気だけ…)

image1.gif

参考URL

Android13対応(ファイルのメディア権限)

Discussion