🎶
【Flutter】simple_audio を試す
概要
今回は以下のパッケージを試してみたいと思います。パッと試すだけなのでAndroidのみで試しています。
- できるだけシンプルに、コア機能のみ (例: 再生/一時停止) を提供
- 安定性と比較的バグのない状態を目指している
パッケージを見てみるとコア部分がRustを使って実装されています。
シンプルに音を鳴らすことに特化したパッケージを目指しているという事なので、実際に試してみたいと思います。
インストール
以下コマンドを実施して追加するか
flutter pub add simple_audio
pubspec.yaml
に以下を追加します。
dependencies:
simple_audio: ^2.0.4
次にサンプル実装に必要なパッケージもインストールしておきます。今回 file_picker と permission_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.storage
はREAD_EXTERNAL_STORAGE
とWRITE_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以上の設定が必要
-
② : Audioファイル読み込み
- file_pickerパッケージを使用して、Audioファイルを読み込んでいます -
③ : Audioファイルの再生
- 今回のメインの処理になります
- SimpleAudioのPlayerを初期化して、Audioファイルのパスを与えています
-open
を実施するとデフォルトで自動再生されます
👇シュミレータで実行すると音が再生されるかと思います。(gifなので雰囲気だけ…)
Discussion