android5.0联系人铃声设置和来电读取

一,单个联系人的铃声设置流程

1,联系人编辑界面下菜单设置来电铃声,会弹出一个ringtone列表供用户选择。
从ContactEditorFragment开始,在doPickRingtone()中启动了startActivityForResult跳转到RingtonePickerActivity显示列表。

注意已经把此联系人读到的ringtoneUri通过intent传出去了

    private void doPickRingtone() {final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);// Allow user to pick 'Default'intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);// Show only ringtonesintent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);// Allow the user to pick a silent ringtoneintent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);final Uri ringtoneUri;if (mCustomRingtone != null) {ringtoneUri = Uri.parse(mCustomRingtone);} else {// Otherwise pick default ringtone Uri so that something is selected.ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);}// Put checkmark next to the current ringtone for this contactintent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);// Launch!try {startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);} catch (ActivityNotFoundException ex) {Toast.makeText(mContext, R.string.missing_app, Toast.LENGTH_SHORT).show();}}

2,ringtone列表的建立和铃声的选择流程(RingtonePickerActivity.java)
在oncreate中通过 mRingtoneManager.getCursor() 来获取铃声资源(具体数据库读取不详说),之后建立列表对话框setupAlert()。

需要注意的是setupAlert()在创建listview的时候,会调用到onPrepareListView()函数,在这个界面,主要是确定单选列表的选中项,也就是mClickedPos的值。假如传入的ringtone uri存在,则确定listview的选中项为此项,如果不存在,则选中项为默认值。

if (mClickedPos == POS_UNKNOWN) {/// M: if the given uri not exist, show default ringtone.if (RingtoneManager.isRingtoneExist(getApplicationContext(), mExistingUri)) {mClickedPos = getListPosition(mRingtoneManager.getRingtonePosition(mExistingUri));} else {if (mHasDefaultItem) {mClickedPos = mDefaultRingtonePos;} else {mClickedPos = getListPosition(mRingtoneManager.getRingtonePosition(RingtoneManager.getDefaultRingtoneUri(getApplicationContext(), mType)));}}}

3,铃声选中后的操作。
进入到onClick()函数里,主要是从mClickedPos的值确定选中的list item,从而获取到ringtone的uri,然后把此uri通过setResult返回给ContactEditorFragment来处理。ContactEditorFragment通过handleRingtonePicked()函数启动contactsaveservice ,把此uri彻底保存到此联系人的数据库中去。(具体可见联系人数据库contact2.db里面的contacts表里的custom_ringtone这一列)

private void handleRingtonePicked(Uri pickedUri) {if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {mCustomRingtone = null;} else {mCustomRingtone = pickedUri.toString();}//set to none ringtone can't be  default ringtone. by yuxihui@malata if(pickedUri == null){mCustomRingtone = "content://settings/system/ringtone/null";}Intent intent = ContactSaveService.createSetRingtone(mContext, mLookupUri, mCustomRingtone);mContext.startService(intent);}

二,来电后读取联系人铃声的流程

来电流程不多讲,重点讲讲Ringer这个类,它继承了CallsManagerListener这个类,所以,当有来电的时候,必然会触

发onCallAdded(final Call call)的接口,里面调用了startRingingOrCallWaiting()来播放铃声。

    public void onCallAdded(final Call call) {if (call.isIncoming() && call.getState() == CallState.RINGING) {if (mRingingCalls.contains(call)) {Log.wtf(this, "New ringing call is already in list of unanswered calls");}mRingingCalls.add(call);updateRinging();}}

我们来看startRingingOrCallWaiting()里面,主要调用的是mRingtonePlayer.play(foregroundCall.getRingtone())。一个是获取ringtone,一个是把获取到的ringtone uri 通过 RingtonePlayer.play的接口播放出来。获取ringtone这块比较简单,读取来电信息就可以(call.java 的 getRingtone(),归根结底是从联系人的数据库中把铃声读出来,具体看上述提到的铃声设置的保存)。RingtonePlayer的Play接口做了什么呢?通过新建一个线程来执行handlePlay(Uri ringtoneUri)。假如ringtone uri为空,则使用系统默认铃声,否则执行handleRepeat()函数,每间隔3秒,循环执行播放mRingtone.play();

    private void handlePlay(Uri ringtoneUri) {// don't bother with any of this if there is an EVENT_STOP waiting.if (mHandler.hasMessages(EVENT_STOP)) {return;}ThreadUtil.checkNotOnMainThread();Log.i(this, "Play ringtone.");if (mRingtone == null) {mRingtone = getRingtone(ringtoneUri);// Cancel everything if there is no ringtone.if (mRingtone == null) {handleStop();return;}}handleRepeat();}

(此文档所述代码基于android5.0 MTK release的code)。

android5.0联系人铃声设置和来电读取分析相关推荐

  1. android 5.0 设置铃声,android5.0联系人铃声设置和来电读取分析

    android5.0联系人铃声设置和来电读取 一,单个联系人的铃声设置流程 1,联系人编辑界面下菜单设置来电铃声,会弹出一个ringtone列表供用户选择. 从ContactEditorFragmen ...

  2. Android8.0开机铃声设置流程

    这里还是以实际项目出发,将遇到的问题总结一下. 1.板子上没有音量键,可以使用命令行模拟音量键: adb shell input keyevent 24:音量加 adb shell input key ...

  3. Android5.0如何正确启用isLoggable(二) 理分析

    转自:http://www.it165.net/pro/html/201506/43374.html 概要 在上文<Android 5.0 如何正确启用isLoggable(一)__使用详解&g ...

  4. 短信 铃声设置成功 android,玩转Android GPhone铃声设置图文教程

    第1页: 昨日,一位同事向笔者问了一个颇具"挑战性"的问题,"HTC G2如何设置铃声".的确对于一款智能手机来说,无论是来电铃声.短信铃声还是脑中铃声的设置都 ...

  5. 将音乐文件设置为来电铃声,短信铃声以及联系人铃声

    http://www.eoeandroid.com/thread-263749-1-1.html 好久没有发帖了,这周做了个将音乐设置为来电铃声,短信铃声,联系人铃声这些小功能!额,具体说说方法吧 / ...

  6. 如何编写程序设置Android来电铃声

    转自:http://www.jizhuomi.com/android/example/360.html 我们在拿到新手机后通常会为其设置来年铃声,那么怎样通过代码来设置Android来电铃声,本文就为 ...

  7. Android 如何设置视频来电的默认铃声

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  8. vue2.0 axios 登录post请求自动读取Set-Cookie设置

    因为axios在登录post请求的时候不会自动读取 Set-Cookie,如图下面的地方 先在在全局配置 axios.defaults.withCredentials = true 下载包 cnpm ...

  9. Android来电铃声默认设置的实现方法与如何设置语音来电的默认铃声

    Android来电铃声默认设置的实现方法与如何设置语音来电的默认铃声 一.Android来电铃声默认设置的实现方法 Andoird默认来电铃声的设置方法为修改build/target/product/ ...

最新文章

  1. 【转】webgame前台开发总结--虽然是10年的文章,但是也有参考价值
  2. mysql pdo 获取最后一条sql_一条SQL如何在MYSQL中执行的
  3. Conda官方下载安装步骤及conda用法详细介绍
  4. [UE4]瞬移前后屏幕亮度变化,Get Player Camera Manager.Start Camera Fade
  5. IDA Pro安装教程
  6. Spring MVC 学习笔记一 HelloWorld
  7. JAVA中断线程的方法
  8. JavaScript 获取浏览器版本
  9. python中的copy模块(浅复制和深复制)
  10. 22.Proxy Objects
  11. Maven的pom.xml文件详解
  12. stylesheettheme和 theme 的区别
  13. android 解压相关问题,解压文件失败的情况
  14. Leftist Heaps
  15. 生于七十年代的20位最具潜质商业精英
  16. 专硕的好消息!北京要大力发展专硕,新增硕士专硕为主!
  17. Documentation
  18. 屏幕录制视频时有杂音怎么办?
  19. Tomcat 启动闪退问题
  20. powerdesigner 16.5 破解步骤

热门文章

  1. 用来评估模型好坏的方差和偏差的区别对比
  2. Kaop打印项之图片
  3. ChatGPT | Word表格整体输出
  4. 学习Python爬虫记录贴
  5. Springboot中的@Profile注解
  6. 【MATLAB图像处理学习】
  7. python信用卡欺诈检(数据清洗,数据分析,数学建模, 模型预测和比较)
  8. 李荣浩建议微信推2倍速听语音功能
  9. PHP采集程序原理分析篇
  10. 详述循环冗余校验CRC(附代码)