マグネテック備忘録

Flutterアプリ開発の備忘録

【Flutter】着信音・アラーム音を鳴らす(ringtone_player)



概要

  • 着信音やアラーム音を鳴らす機能を備えたパッケージです。
  • AndroidやiOS既定の着信音を鳴らせるのはもちろん、自分で指定したmp3ファイルを鳴らすことも可能です。
  • 再生位置の調整など音楽に特化させたいのなら、「audioplayers」の方がよいかもしれません。こちらについても記事にまとめているので、良かったら参考にしてください(露骨な宣伝)⇒【Flutter】音楽を鳴らす(audioplayers) - マグネテック備忘録
  • ↓↓ringtone_playerの公式サイト

pub.dev


インストール

dependencies:
  flutter_ringtone_player: ^3.2.0


注)4.0.0以降を使うとき

  • 私の環境では「flutter_ringtone_player ^4.0.0 which depends on flutter_lints ^3.0.1, flutter_lints ^3.0.1 is required. So, because ~ depends on flutter_lints ^2.0.0, version solving failed.」というエラーが出ました。
  • 解決法はシンプルで、flutter_lintsを変更すればOKでした。
dependencies:
  flutter_ringtone_player: ^4.0.0

dev_dependencies:
  flutter_lints: ^3.0.1





超基本:FlutterRingtonePlayer.play

引数

  • alarmは一周期が長いので、loopingの動作確認はnotificationでやるのがオススメです。
  • 「android & ios」 か 「fromAsset」のどちらかを設定する必要があります。
android
  • Androidでの音の種類
  • alarm(アラーム), notification(通知), ringtone(着信)の3種類が指定可能。
ios iOSの場合。設定方法はandroidと同様。
fromAsset ファイルで指定した音源から鳴らす場合に使用。
volume 音の大きさを0~1の小数で設定(デフォルトは1?)
asAlarm trueならマナーモードでも音を鳴らす(デフォルトはfalse)
looping trueならループする(デフォルトはfalse)



使用例(1):通知音の種類を指定して鳴らす場合

  • android or iosのどちらかしか使わない場合でも、両方設定しないと音が鳴りません。
FlutterRingtonePlayer.play(
  android: AndroidSounds.alarm,
  ios: IosSounds.alarm,
);



使用例(2):mp3ファイルから鳴らす場合

準備

使用する音源「sample.mp3」を適当なフォルダ内に置きます。
sample.mp3を追加

後は、参照したいファイルのパスをpubspec.yamlに追加すればOKです。

flutter:
  assets:
    - assets/sample.mp3



サンプルコード

FlutterRingtonePlayer.play(
  fromAsset: "assets/sample.mp3",
);





通知音を指定して鳴らす場合

FlutterRingtonePlayer().playAlarm();

  • 音をalarm(アラーム)で固定(変更不可)。
  • デフォルトでasAlarm=true, looping=true(変更可)。
  • そのため、以下のコードと同義。
FlutterRingtonePlayer.play(
  android: AndroidSounds.alarm,
  ios: IosSounds.alarm,
  asAlarm: true,
  looping: true
);



FlutterRingtonePlayer.playNotification();

  • 音をnotification(通知)で固定(変更不可)。
  • デフォルトでasAlarm=false, looping=false(変更可)。
  • 以下のコードと同義。
FlutterRingtonePlayer.play(
  android: AndroidSounds.notification,
  ios: IosSounds.notification,
  asAlarm: false,
  looping: false
);



FlutterRingtonePlayer.playRingtone();

  • 音をringtone(着信)で固定(変更不可)。
  • デフォルトでasAlarm=false, looping=true(変更可)。
  • 以下のコードと同義。
FlutterRingtonePlayer.play(
  android: AndroidSounds.ringtone,
  ios: IosSounds.notification,
  asAlarm: false,
  looping: true
);




鳴らした音を止める

FlutterRingtonePlayer.stop();



デモアプリ

画面

デモ画面

サンプルコード

  • 音源ファイルの設定は、「使用例(2):mp3ファイルから鳴らす場合」でしたため省略。

import 'package:flutter/material.dart';
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';

void main() {
  const app = MaterialApp(
    home: MyHomePage(),
  );

  runApp(app);
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.indigo.shade200,
        title: const Text('Ringtone Sample'),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            ElevatedButton(
              child: const Text('play(android, ios = alarm)'),
              onPressed: () {
                FlutterRingtonePlayer.play(
                    android: AndroidSounds.alarm,
                    ios: IosSounds.alarm,
                    asAlarm: true,
                    looping: true);
              },
            ),
            ElevatedButton(
              child: const Text('play(fromAsset)'),
              onPressed: () {
                FlutterRingtonePlayer.play(
                  fromAsset: "assets/sample.mp3",
                );
              },
            ),
            ElevatedButton(
              child: const Text('playAlarm'),
              onPressed: () {
                FlutterRingtonePlayer.playAlarm();
              },
            ),
            ElevatedButton(
              child: const Text('playNotification'),
              onPressed: () {
                FlutterRingtonePlayer.playNotification(asAlarm: true);
              },
            ),
            ElevatedButton(
              child: const Text('playRingtone'),
              onPressed: () {
                FlutterRingtonePlayer.playRingtone(asAlarm: true);
              },
            ),
            ElevatedButton(
              child: const Text('stop'),
              onPressed: () {
                FlutterRingtonePlayer.stop();
              },
            )
          ],
        ),
      ),
    );
  }
}