使从铃声管理(RingtoneManage)获取到的Ringtone重复播放

近日,因项目需要,要从系统铃声选择对话框中获取系统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();
		}
	}

试一下效果,看看是否已经重复播放铃声了?

转载于:https://my.oschina.net/winktj/blog/73718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值