失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > android开发笔记之联系人中添加手机铃声功能的实现

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

时间:2020-06-18 08:57:25

相关推荐

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

这二天,在联系人(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 privatevoiddoPickRingtone(){ Intentintent=newIntent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT,true); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_RINGTONE); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT,false); UriringtoneUri; /** if(mCustomRingtone!=null){ringtoneUri=Uri.parse(mCustomRingtone); }else{ringtoneUri=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); } **/ ringtoneUri=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI,ringtoneUri); ((Activity)mContext).startActivityForResult(intent,REQUEST_CODE_PICK_RINGTONE); android.util.Log.i("set_ring_tone","((Activity)mContext):"+((Activity)mContext)); }

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

[java]view plain copy //addbywingtechhexiaomingforadd_ring_tone1107start publicstaticUripickedUri=null; @Override publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ if(resultCode!=Activity.RESULT_OK){ return; } switch(requestCode){ caseRawContactEditorView.REQUEST_CODE_PICK_RINGTONE:{ pickedUri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); //handleRingtonePicked(pickedUri); android.util.Log.i("set_ring_tone","pickedUri:"+pickedUri); Stringringtone_title=getRingtoneName(pickedUri); updateRingtone(ringtone_title); break; } } } //addbywingtechhexiaomingforadd_ring_tone1107end

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

[java]view plain copy publicStringgetRingtoneName(Uriringtone){ Stringringtone_title=null; try{ Cursorcursor=getContentResolver().query(ringtone, newString[]{MediaStore.Audio.Media.TITLE},null,null,null); if(cursor!=null){ if(cursor.moveToFirst()){ ringtone_title=cursor.getString(0); } cursor.close(); } }catch(SQLiteExceptionsqle){ //Unknowntitlefortheringtone sqle.printStackTrace(); } returnringtone_title; }

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

[java]view plain copy privatevoidupdateRingtone(Stringringtone_title){ mFragment.updateRingtone(ringtone_title); }

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

[java]view plain copy privatevoidhandleRingtonePicked(UripickedUri){ if(pickedUri==null||RingtoneManager.isDefault(pickedUri)){ mCustomRingtone=null; }else{ mCustomRingtone=pickedUri.toString(); } Intentintent=ContactSaveService.createSetRingtone( mContext,mLookupUri,mCustomRingtone); mContext.startService(intent); }

我们在ContactEditorFragment----save方法的,调用handleRingtonePicked此方法,就OK。 但是,这有一个在新建时,mLookupUri 为null的情况,所以,我们还是要在ContactSaveService -----saveContact 方法中,找到lookupUri的不为null值的地方加上:[java]view plain copy //addbywingtechhexiaomingforadd_ring_tone1107start android.util.Log.i("saveContact","lookupUri_3:"+lookupUri); if(ContactEditorActivity.pickedUri!=null){ Intentintent_save_ringtone=createSetRingtone(this,lookupUri,ContactEditorActivity.pickedUri.toString()); startService(intent_save_ringtone); } //addbywingtechhexiaomingforadd_ring_tone1107end

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

[java]view plain copy publicStringgetRingtoneFromLookup(Stringlookup){ Cursorcursor=mContext.getContentResolver().query( android.provider.ContactsContract.Contacts.CONTENT_URI, newString[]{android.provider.ContactsContract.Contacts.CUSTOM_RINGTONE}, android.provider.ContactsContract.Contacts.LOOKUP_KEY+"=?", newString[]{lookup}, null); try{ if(cursor.moveToFirst()){ android.util.Log.i("ContactEditorFragment","cursor.getString(0):"+cursor.getString(0)); returncursor.getString(0); } }finally{ cursor.close(); } returnnull; }

4. 一些总结:

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

如果觉得《android开发笔记之联系人中添加手机铃声功能的实现》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。