近日,因项目需要,要从系统铃声选择对话框中获取系统Ringtone。
获取很顺利,只需要下面的代码就能打开系统的铃声对话框
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_ALARM);
startActivityForResult(intent, REQUEST_OK);
然后只需要在本Activity中,重写onActivityResult()来接收返回Ringtone的Uri.
但问题是调用Ringtone的play()方法,铃声只能播放一次,这不能适合我做闹钟的需求。
上网搜了一下,感觉貌似很少有人用这个Ringtone去播放铃声。没办法,只有自己来了。
查看Ringtone的官方sdk,Ringtone并没有提供实现循环播放的方法或者属性,看来只能do some trick啦。
再查看Ringtone的源代码,发现其实Ringtone里面有一个Mediaplayer实例,实际上Ringtone就是经过封装过的MediaPlayer.
MediaPlayer里面有一个方法setLooping(boolean repeat),这个方法可以让MediaPlayer重复播放一段音乐。
ok,就是它了,既然RIngtone不提供方法实现重复播放,我们直接反射获取Ringtone上的MediaPlayer,然后把它设置成重复播放。
private void setRingtoneRepeat(Ringtone ringtone){
Class<Ringtone> clazz = Ringtone.class;
try {
Field audio = clazz.getDeclaredField("mAudio");
audio.setAccessible(true);
MediaPlayer target = (MediaPlayer) audio.get(ringtone);
target.setLooping(true);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
试一下效果,看看是否已经重复播放铃声了?