这二天,在联系人(Contacts)的新建编辑界面添加了一个来电手机铃声的功能,现在把一些关键的地方写出来,做一个小笔记吧。

1. 功能需求:

在新建编辑联系人界面,添加一个手机铃声入口,点击可以进入铃声选择界面,返回一个手机铃声的url.

2. 一些说明:

这主要涉及到的db数据库:

data/data/com.android.providers.contacts/databases/contacts2.db
表:contacts
url:  android.provider.ContactsContract.Contacts.CONTENT_URI
我们到时候,主要要用到的,还是lookup和custom_ringtone这二个字段。

3. 关键的逻辑处理代码:

(1)在RawContactEditorView.java文件中,添加手机铃声界面,当点击来电铃声时,发出选择来电铃声的Intent

[java]  view plain copy
  1. private void doPickRingtone() {
  2. Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
  3. intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
  4. intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
  5. intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
  6. Uri ringtoneUri;
  7. /**
  8. if (mCustomRingtone != null) {
  9. ringtoneUri = Uri.parse(mCustomRingtone);
  10. } else {
  11. ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
  12. }
  13. **/
  14. ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
  15. intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
  16. ((Activity)mContext).startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);
  17. android.util.Log.i("set_ring_tone","((Activity)mContext):"+((Activity)mContext));
  18. }

(2).在ContactEditorActivity 中得到返回的铃声uri:

[java]  view plain copy
  1. //add by wingtech hexiaoming for add_ring_tone  20141107 start
  2. public static Uri pickedUri = null;
  3. @Override
  4. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  5. if (resultCode != Activity.RESULT_OK) {
  6. return;
  7. }
  8. switch (requestCode) {
  9. case RawContactEditorView.REQUEST_CODE_PICK_RINGTONE: {
  10. pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
  11. //handleRingtonePicked(pickedUri);
  12. android.util.Log.i("set_ring_tone","pickedUri:"+pickedUri);
  13. String ringtone_title = getRingtoneName(pickedUri);
  14. updateRingtone(ringtone_title);
  15. break;
  16. }
  17. }
  18. }
  19. //add by wingtech hexiaoming for add_ring_tone  20141107 end

(3).用铃声的uri值得到铃声的名称:

[java]  view plain copy
  1. public  String  getRingtoneName(Uri ringtone) {
  2. String ringtone_title = null;
  3. try {
  4. Cursor cursor = getContentResolver().query(ringtone,
  5. new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
  6. if (cursor != null) {
  7. if (cursor.moveToFirst()) {
  8. ringtone_title = cursor.getString(0);
  9. }
  10. cursor.close();
  11. }
  12. } catch (SQLiteException sqle) {
  13. // Unknown title for the ringtone
  14. sqle.printStackTrace();
  15. }
  16. return ringtone_title;
  17. }

(4)更新来电铃声的名称:

[java]  view plain copy
  1. private void  updateRingtone(String ringtone_title) {
  2. mFragment.updateRingtone(ringtone_title);
  3. }

(5)在ContactEditorFragment.java 我们保存来电铃声的uri,这个其实主要是靠mLookupUri 来做条件,来对应的保存:

[java]  view plain copy
  1. private void handleRingtonePicked(Uri pickedUri) {
  2. if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
  3. mCustomRingtone = null;
  4. } else {
  5. mCustomRingtone = pickedUri.toString();
  6. }
  7. Intent intent = ContactSaveService.createSetRingtone(
  8. mContext, mLookupUri, mCustomRingtone);
  9. mContext.startService(intent);
  10. }
我们在ContactEditorFragment----save方法的,调用handleRingtonePicked此方法,就OK。
但是,这有一个在新建时,mLookupUri 为null的情况,所以,我们还是要在ContactSaveService -----saveContact 方法中,找到lookupUri的不为null值的地方加上:
[java]  view plain copy
  1. //add by wingtech hexiaoming for add_ring_tone  20141107 start
  2. android.util.Log.i("saveContact","lookupUri_3:"+lookupUri);
  3. if(ContactEditorActivity.pickedUri != null){
  4. Intent intent_save_ringtone = createSetRingtone(this, lookupUri, ContactEditorActivity.pickedUri.toString());
  5. startService(intent_save_ringtone);
  6. }
  7. //add by wingtech hexiaoming for add_ring_tone  20141107 end

(6)当我们刚进来时,我们就要读取根据lookup的值来读取custom_ringtone,然后,再根据custom_ringtone读取(getRingtoneName)铃声的名称,显示出来。

[java]  view plain copy
  1. public  String getRingtoneFromLookup(String lookup) {
  2. Cursor cursor = mContext.getContentResolver().query(
  3. android.provider.ContactsContract.Contacts.CONTENT_URI,
  4. new String[]{android.provider.ContactsContract.Contacts.CUSTOM_RINGTONE},
  5. android.provider.ContactsContract.Contacts.LOOKUP_KEY + "= ?",
  6. new String[]{lookup},
  7. null);
  8. try {
  9. if (cursor.moveToFirst()) {
  10. android.util.Log.i("ContactEditorFragment","cursor.getString(0):"+cursor.getString(0));
  11. return cursor.getString(0);
  12. }
  13. } finally {
  14. cursor.close();
  15. }
  16. return null;
  17. }

4. 一些总结:

做这个功能,个人觉得,做到最后,还是发现用的东西都是一些基础的东西,如ContentProvider,Intent,Activity等,所以,自己的基础一定要打好,基本的掌握好了,做东西的时候,心中就会知道要做什么,用到的东西在那里,要如何一步一步的实现。
还有就是许多小细节,也是要我们自己打LOG,看明白,到底是怎么回事。特别是我们做二次开发,有许多东西,我们只要找到我们关心的部分,把东西打印出来,就会清楚的明白代码是怎么运行的,然后再添加自己要做的东西。
最后,可能有人问,我怎么没有把界面那部分写也来,我个人觉得那部分太简单了,唯一有点难度的,可能就是在设置来电铃声的名称的一些细节,对于细节问题,我想说,这不是问题,只要你把东西打印出来,基本上就能解决的。

android开发笔记之联系人中添加手机铃声功能的实现相关推荐

  1. Android开发笔记(五十八)铃声与震动

    拖动条SeekBar SeekBar继承自进度条ProcessBar,有关ProcessBar的介绍见<Android开发笔记(四十九)异步任务处理AsyncTask>.SeekBar与P ...

  2. 云炬Android开发笔记 13购物车,订单,支付功能开发(包含支付宝支付和微信支付)

    阅读目录 1.购物车UI编写 1.1 购物车布局  1.2 recycleView中的item的布局 2. 购物车数据结构分析.解析与转化 2.1 解析的数据 2.2 数据的转化 2.3 数据适配器的 ...

  3. Android开发笔记(序)写在前面的目录

    知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入 ...

  4. Android开发笔记(六十一)文件下载管理DownloadManager

    下载管理DownloadManager 文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些.因为下载功能比较常用,而且业务功能相对统一,所以从Androi ...

  5. Android开发笔记(序)

    本开发笔记,借鉴与其他开发者整理的文章范例与心得体会.在这里作为开发过程中的一个总结与笔记式记录. 如有侵犯作者权益,请及时联系告知删除.俗话说:集百家成一言,去粕成金. ************** ...

  6. Android开发笔记(序)写在前面的目录大全

    转自  湖前琴亭 的博客https://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面 ...

  7. Andriod开发之二十:Android开发笔记(序)写在前面的目录

    https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...

  8. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

  9. Android开发笔记(五十九)巧用传感器

    传感器Sensor 传感器是Android用来感知周围环境以及运动信息的工具.因为具体的感应信息依赖于相关硬件,所以虽然Android提供了众多的感应器,但不是每部手机都能支持这么多感应器,恰恰相反, ...

最新文章

  1. 为什么c程序里一定要写main函数
  2. startprocessinstancebykey()里面填写的参数_3种方法,快速学会在Word文档里面如何插入表格...
  3. 艾伟也谈项目管理,说说我们项目组的考核
  4. Winpcap网络编程十之Winpcap实战,两台主机通过中间主机通信
  5. 计算机电源插头有哪几种,盘点电连接器常见的使用类型
  6. 建站如此容易:WordPress3.9建站简明视频教程完成发布啦
  7. element 动态加载下拉框_动态增加select框(elementUI 框架)
  8. 给大家讲讲在哪些地方发外链最好
  9. python 生成空白矩阵_3个用于数据科学的顶级Python库
  10. poi(easypoi)导出excel(xls,xlsx)后,文件打开错误或乱码的解决方法(亲测)
  11. Xposed框架指南
  12. python 显示字典内容_在pythontkin的标签中显示字典内容
  13. 【CKA考试笔记】十三、k8s中的网络
  14. c语言编译星座测试,用c语言编写程序,判断输入的日期(月,日)属于哪个星座?...
  15. 今日头条这么火,主要解决了用户的哪些基本痛点
  16. 一个简单的税利计算器(网页版)
  17. 如何打造一个抗住千万级流量短信服务(续)
  18. 小米摄像机 nas网络存储 群晖nas
  19. 【闲来无事】仿知乎广告Banner的切换功能,androidstudio实训总结
  20. Linux上Nginx的安装及使用(在线及离线安装)

热门文章

  1. 字节、位、比特的概念和关系
  2. 降维方法小结和理解:PCA、LDA、MDS、ISOMAP、SNE、T-SNE、AutoEncoder
  3. 数据爬取大案例?——阿里巴巴诉南京码注公司数据抓取案​
  4. 刘涛淘宝直播当众怼人,引来一片叫好:懂得拒绝的人,活得有多爽?
  5. 施努卡:你不知道的总装车间,其实是这样的
  6. java提示无法加载主类_EditPlus提示错误:找不到或无法加载主类
  7. mvvm mvc的区别
  8. 尚硅谷 JavaScript笔记 整理
  9. 微信小程序下拉框插件_微信小程序三级联动下拉框插件
  10. Lexical Scoping 和 Dynamic Scoping