Android(安卓)铃音设置分析
由于android默认的铃音设在只能在特定的文件(alarms,notifications,ringtones)中搜索铃音文件,所以想自己实现一个铃音选择器,看了下google官方的API其中提供了setActualDefaultRingtoneUri()来实现铃音的设置(其实这个API有点纠结,一会再说),但是怎么启动这个程序呢,不可能创建一个图标又启动器来启动吧?原生的铃音选择是怎么运行的?其实很简单使用android的Intent机制当程序想要选择铃声的时候创建一个Intent里面包含了选择铃音的"意图",所以这个程序要接收这个"意图"在AndroidManifest.xml里注册
<intent-filter><action android:name="android.intent.action.RINGTONE_PICKER" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
需要的都有了,几个小时后程序完成了,安装到手机打开"设置-铃音"出现了我的程序图标一切都和预想的一样,设置一下来电铃音成功了,这时突然想到android的"短信"可以设置单独的铃音,可是当我设置后却发现失败了,这就是我说这个API纠结的原因.于是我在网上搜索了下,发现网上的实现和我用的方法一样,但就是没用,百思不得其解没办法看看源码是怎么实现的啊,于是我在源码中搜索 android.intent.action.RINGTONE_PICKER看看是哪个Activity接受了这个意图,于是我找到了RingtonePickerActivity.java但是我发现这里面更本没有调用setActualDefaultRingtoneUri ()这个问题就诡异了,没有使用API怎么设置铃音(其实很简单,但这里我犯了一个错误导致我研究了很久),没办法一点一点看吧,我知道系统默认的铃音选择器是一个Dialog那么关键部份一定是在当你按下"确定"后它做了些什么?
/*这里是RingtonePickerActivity.java的源码片段*/resultIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, uri);setResult(RESULT_OK, resultIntent);
这就是关键的地方当获取了铃声的Uri后就直接返回到调用他的Activity了,并且将这个uri返回给了Activity,一开始没想通,但后来分析了一下整个铃音设置的流程才明白其中的道理.
其实setActualDefaultRingtoneUri() 这个API就向官方文档所说的一样它设置的是"默认"铃音,所以当我在”设置-铃音”中使用他能正确运行,应为"设置"这个程序本身就是设置系统默认铃音,而在例如短信这些能单独设置铃音的程序里他是不会成功的,这是因为这个意图仅仅是启动一个"铃音选择"而不是铃音设置,所以这个被启动的Activity应该返回一个Uri给启动它的Activity,而铃音的设置的应该由启动它的Activity自己完成,例如"设置"这个程序,当你在设置铃音时它传递一个意图启动了铃音选择的程序,当你选择好后返回铃声的Uri给"设置",当"设置"接受到这个Uri后由设置来调用setActualDefaultRingtoneUri()设置默认铃音,那么你想给"短信"这个程序单独设置铃音的时候其实只要返回给它一个铃音的Uri就可以了,具体的操作由它自己完成.
出现这样的问题其实是概念混乱的原因,现在网络中各种各样的教程都是调用setActualDefaultRingtoneUri ()虽然这样没错,但是却没有说明白.setActualDefaultRingtoneUri() 仅仅是设置默认铃音,而设置铃音的标准方法返回一个Uri就可以了,这就导致很多人实验了后会问为什么会设置失败...
更多相关文章
- 适用于Android的Google Fit:读取传感器数据
- Android下编译库文件jar包并在应用中调用
- 那两年炼就的Android内功修养
- Android之如何打开USB调试模式
- Android(安卓)Launcher抽屉类SlidingDrawer的使用
- GCM架构概览
- Android开发指南目录
- Android(安卓)Studio运行程序出现Session ‘app’: Error Launch
- Android实战简易教程(分享小米手电筒源码)