这二天,在联系人(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