由于android默认的铃音设在只能在特定的文件(alarms,notifications,ringtones)中搜索铃音文件,所以想自己实现一个铃音选择器,看了下google官方的API其中提供了setActualDefaultRingtoneUri()来实现铃音的设置(其实这个API有点纠结,一会再说),但是怎么启动这个程序呢,不可能创建一个图标又启动器来启动吧?原生的铃音选择是怎么运行的?其实很简单使用androidIntent机制当程序想要选择铃声的时候创建一个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就可以了,这就导致很多人实验了后会问为什么会设置失败...


更多相关文章

  1. 适用于Android的Google Fit:读取传感器数据
  2. Android下编译库文件jar包并在应用中调用
  3. 那两年炼就的Android内功修养
  4. Android之如何打开USB调试模式
  5. Android(安卓)Launcher抽屉类SlidingDrawer的使用
  6. GCM架构概览
  7. Android开发指南目录
  8. Android(安卓)Studio运行程序出现Session ‘app’: Error Launch
  9. Android实战简易教程(分享小米手电筒源码)

随机推荐

  1. Android(安卓)SwipeRefreshLayout 自动刷
  2. Android(安卓)LCD(二):LCD常用接口原理篇
  3. Android微信支付开发流程
  4. Android的UI显示原理之Surface的创建
  5. Android(安卓)Overlay机制
  6. Android(安卓)地理编码&逆地理编码(百度、
  7. Android(安卓)Studio "nativeLibraryDire
  8. jQuery 判断iPad、iPhone、Android是横屏
  9. 搭建andorid开发环境
  10. Windows下安装 Android(安卓)Studio