シンプルでかわいい「ふわぷかタイマー」というタイマーアプリを作ったときの備忘録。
アラーム音・着信音の一覧をとってきたり、アラーム音を再生したいなと。
機種に入っている着信音(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()
を使ってはいけない
が、setAudioStreamTypeメソッドをMediaPlayer.createで作成したインスタンスに対して実行すると、
error (-38, 0)
とか
prepareAsync called in state 8
とか
setAudioStream called in state 8
とかエラーが起こります。
これはMediaPlayer.createメソッドが、内部的にすでにprepare(準備)メソッドを呼んでいるためで、
ストリームタイプの変更は、準備の前に実行しておく必要があります。
らしい。
ここではまった。。。
以上!!