くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Androidで通知音やアラーム音を再生する(MediaPlayerとかRingtoneManagerとか)

シンプルでかわいい「ふわぷかタイマー」というタイマーアプリを作ったときの備忘録。

f:id:wannabe-jellyfish:20160507200224p:plain play.google.com

アラーム音・着信音の一覧をとってきたり、アラーム音を再生したいなと。

機種に入っている着信音(Ringtone)は、RingtoneManager

再生するにはMediaPlayerをつかうらしい

設定している着信音のUriを取得する

Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);     // 着信音
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);        // アラーム音
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); // 通知音

着信音の一覧を取得する

RingtoneManager manager = new RingtoneManager(context); // マネージャを作成
manager.setType(RingtoneManager.TYPE_ALL);              // 着信音・アラーム音・通知音の全部
// manager.setType(RingtoneManager.TYPE_RINGTONE);      // 着信音だけ
// manager.setType(RingtoneManager.TYPE_ALARM);         // アラーム音だけ
// manager.setType(RingtoneManager.TYPE_NOTIFICATION);  // 通知音だけ

//カーソルを取得して、moveToNextしていく
Cursor cursor = manager.getCursor();
while (cursor.moveToNext()) {
  String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);    // 着信音などの名前
  String uriPrefix = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
  String index = cursor.getString(RingtoneManager.ID_COLUMN_INDEX);
  String uri = uriPrefix + "/" + index;                                   // ※URIはuriPrefixとindexをつなげる必要あり
  Log.d(this.getClass().getSimpleName(), "title = " + title + ", uriPrefix = " + uriPrefix + ", index = " + index);
}

着信音を再生する(Ringtone ver.)

とりあえず再生したいだけだったら、Ringtoneを使えばOK

Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
Ringtone ringtone = RingtoneManager.getRingtone(context, uri);

ringtone.play(); // 再生
ringtone.stop(); // 停止

着信音を再生する(MediaPlayer ver.)

単に再生するだけじゃなく、繰り返し再生やどのボリュームで再生したかなど設定したいときは、MediaPlayerを使う

Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);

MediaPlayer player = new MediaPlayer();
player.setDataSource(context, uri);                   // 音声を設定
player.setAudioStreamType(AudioManager.STREAM_ALARM); // アラームのボリュームで再生
player.setLooping(true);                              // ループ再生を設定
player.prepare();                                     // 音声を読み込み

player.start(); // 再生
player.stop();  // 停止

※注意:: setAudioStreamType()したいときは、MediaPlayer.create()を使ってはいけない

blog.loadlimits.info

が、setAudioStreamTypeメソッドをMediaPlayer.createで作成したインスタンスに対して実行すると、

error (-38, 0)

とか

prepareAsync called in state 8

とか

setAudioStream called in state 8

とかエラーが起こります。

これはMediaPlayer.createメソッドが、内部的にすでにprepare(準備)メソッドを呼んでいるためで、

ストリームタイプの変更は、準備の前に実行しておく必要があります。

らしい。

ここではまった。。。

以上!!

参考にしたサイト様