android 联系人中添加手机铃声功能的实现
2014-11-13 09:00
1171 查看
这二天,在联系人(Contacts)的新建编辑界面添加了一个来电手机铃声的功能,现在把一些关键的地方写出来,做一个小笔记吧。
在新建编辑联系人界面,添加一个手机铃声入口,点击可以进入铃声选择界面,返回一个手机铃声的url.
这主要涉及到的db数据库:
data/data/com.android.providers.contacts/databases/contacts2.db
表:contacts
url: android.provider.ContactsContract.Contacts.CONTENT_URI
我们到时候,主要要用到的,还是lookup和custom_ringtone这二个字段。
[java] view
plaincopy
private void doPickRingtone() {
Intent intent = new Intent(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);
Uri ringtoneUri;
/**
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));
}
[java] view
plaincopy
//add by wingtech hexiaoming for add_ring_tone 20141107 start
public static Uri pickedUri = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case RawContactEditorView.REQUEST_CODE_PICK_RINGTONE: {
pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
//handleRingtonePicked(pickedUri);
android.util.Log.i("set_ring_tone","pickedUri:"+pickedUri);
String ringtone_title = getRingtoneName(pickedUri);
updateRingtone(ringtone_title);
break;
}
}
}
//add by wingtech hexiaoming for add_ring_tone 20141107 end
[java] view
plaincopy
public String getRingtoneName(Uri ringtone) {
String ringtone_title = null;
try {
Cursor cursor = getContentResolver().query(ringtone,
new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
ringtone_title = cursor.getString(0);
}
cursor.close();
}
} catch (SQLiteException sqle) {
// Unknown title for the ringtone
sqle.printStackTrace();
}
return ringtone_title;
}
[java] view
plaincopy
private void updateRingtone(String ringtone_title) {
mFragment.updateRingtone(ringtone_title);
}
[java] view
plaincopy
private void handleRingtonePicked(Uri pickedUri) {
if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
mCustomRingtone = null;
} else {
mCustomRingtone = pickedUri.toString();
}
Intent intent = ContactSaveService.createSetRingtone(
mContext, mLookupUri, mCustomRingtone);
mContext.startService(intent);
}
我们在ContactEditorFragment----save方法的,调用handleRingtonePicked此方法,就OK。
但是,这有一个在新建时,mLookupUri 为null的情况,所以,我们还是要在ContactSaveService -----saveContact 方法中,找到lookupUri的不为null值的地方加上:
[java] view
plaincopy
//add by wingtech hexiaoming for add_ring_tone 20141107 start
android.util.Log.i("saveContact","lookupUri_3:"+lookupUri);
if(ContactEditorActivity.pickedUri != null){
Intent intent_save_ringtone = createSetRingtone(this, lookupUri, ContactEditorActivity.pickedUri.toString());
startService(intent_save_ringtone);
}
//add by wingtech hexiaoming for add_ring_tone 20141107 end
[java] view
plaincopy
public String getRingtoneFromLookup(String lookup) {
Cursor cursor = mContext.getContentResolver().query(
android.provider.ContactsContract.Contacts.CONTENT_URI,
new String[]{android.provider.ContactsContract.Contacts.CUSTOM_RINGTONE},
android.provider.ContactsContract.Contacts.LOOKUP_KEY + "= ?",
new String[]{lookup},
null);
try {
if (cursor.moveToFirst()) {
android.util.Log.i("ContactEditorFragment","cursor.getString(0):"+cursor.getString(0));
return cursor.getString(0);
}
} finally {
cursor.close();
}
return null;
}
做这个功能,个人觉得,做到最后,还是发现用的东西都是一些基础的东西,如ContentProvider,Intent,Activity等,所以,自己的基础一定要打好,基本的掌握好了,做东西的时候,心中就会知道要做什么,用到的东西在那里,要如何一步一步的实现。
还有就是许多小细节,也是要我们自己打LOG,看明白,到底是怎么回事。特别是我们做二次开发,有许多东西,我们只要找到我们关心的部分,把东西打印出来,就会清楚的明白代码是怎么运行的,然后再添加自己要做的东西。
最后,可能有人问,我怎么没有把界面那部分写也来,我个人觉得那部分太简单了,唯一有点难度的,可能就是在设置来电铃声的名称的一些细节,对于细节问题,我想说,这不是问题,只要你把东西打印出来,基本上就能解决的。
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] viewplaincopy
private void doPickRingtone() {
Intent intent = new Intent(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);
Uri ringtoneUri;
/**
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] viewplaincopy
//add by wingtech hexiaoming for add_ring_tone 20141107 start
public static Uri pickedUri = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case RawContactEditorView.REQUEST_CODE_PICK_RINGTONE: {
pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
//handleRingtonePicked(pickedUri);
android.util.Log.i("set_ring_tone","pickedUri:"+pickedUri);
String ringtone_title = getRingtoneName(pickedUri);
updateRingtone(ringtone_title);
break;
}
}
}
//add by wingtech hexiaoming for add_ring_tone 20141107 end
(3).用铃声的uri值得到铃声的名称:
[java] viewplaincopy
public String getRingtoneName(Uri ringtone) {
String ringtone_title = null;
try {
Cursor cursor = getContentResolver().query(ringtone,
new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
ringtone_title = cursor.getString(0);
}
cursor.close();
}
} catch (SQLiteException sqle) {
// Unknown title for the ringtone
sqle.printStackTrace();
}
return ringtone_title;
}
(4)更新来电铃声的名称:
[java] viewplaincopy
private void updateRingtone(String ringtone_title) {
mFragment.updateRingtone(ringtone_title);
}
(5)在ContactEditorFragment.java 我们保存来电铃声的uri,这个其实主要是靠mLookupUri 来做条件,来对应的保存:
[java] viewplaincopy
private void handleRingtonePicked(Uri pickedUri) {
if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
mCustomRingtone = null;
} else {
mCustomRingtone = pickedUri.toString();
}
Intent intent = ContactSaveService.createSetRingtone(
mContext, mLookupUri, mCustomRingtone);
mContext.startService(intent);
}
我们在ContactEditorFragment----save方法的,调用handleRingtonePicked此方法,就OK。
但是,这有一个在新建时,mLookupUri 为null的情况,所以,我们还是要在ContactSaveService -----saveContact 方法中,找到lookupUri的不为null值的地方加上:
[java] view
plaincopy
//add by wingtech hexiaoming for add_ring_tone 20141107 start
android.util.Log.i("saveContact","lookupUri_3:"+lookupUri);
if(ContactEditorActivity.pickedUri != null){
Intent intent_save_ringtone = createSetRingtone(this, lookupUri, ContactEditorActivity.pickedUri.toString());
startService(intent_save_ringtone);
}
//add by wingtech hexiaoming for add_ring_tone 20141107 end
(6)当我们刚进来时,我们就要读取根据lookup的值来读取custom_ringtone,然后,再根据custom_ringtone读取(getRingtoneName)铃声的名称,显示出来。
[java] viewplaincopy
public String getRingtoneFromLookup(String lookup) {
Cursor cursor = mContext.getContentResolver().query(
android.provider.ContactsContract.Contacts.CONTENT_URI,
new String[]{android.provider.ContactsContract.Contacts.CUSTOM_RINGTONE},
android.provider.ContactsContract.Contacts.LOOKUP_KEY + "= ?",
new String[]{lookup},
null);
try {
if (cursor.moveToFirst()) {
android.util.Log.i("ContactEditorFragment","cursor.getString(0):"+cursor.getString(0));
return cursor.getString(0);
}
} finally {
cursor.close();
}
return null;
}
4. 一些总结:
做这个功能,个人觉得,做到最后,还是发现用的东西都是一些基础的东西,如ContentProvider,Intent,Activity等,所以,自己的基础一定要打好,基本的掌握好了,做东西的时候,心中就会知道要做什么,用到的东西在那里,要如何一步一步的实现。还有就是许多小细节,也是要我们自己打LOG,看明白,到底是怎么回事。特别是我们做二次开发,有许多东西,我们只要找到我们关心的部分,把东西打印出来,就会清楚的明白代码是怎么运行的,然后再添加自己要做的东西。
最后,可能有人问,我怎么没有把界面那部分写也来,我个人觉得那部分太简单了,唯一有点难度的,可能就是在设置来电铃声的名称的一些细节,对于细节问题,我想说,这不是问题,只要你把东西打印出来,基本上就能解决的。
相关文章推荐
- Android手机联系人源码(添加联系人页面一个功能)修改
- Android 添加联系人发短信以及打电话功能实现
- Android使用AsyncQueryHandler实现获取手机联系人功能
- Android App实现点击拨号、复制剪贴板、添加手机联系人
- Android编程实现通讯录中联系人的读取,查询,添加功能示例
- 微信小程序实现添加手机联系人功能示例
- Android编程实现通讯录中联系人的读取,查询,添加功能示例
- 实现手机来电铃声,通知铃声、警告铃声等音频定制化功能(一,添加扫描分区myimage)
- Android ContentProvider实现获取手机联系人功能
- android 手机震动功能实现
- Android 手机震动功能实现
- 举例说明android中SmsManager的用法---用来实现手机发送短信的功能
- Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解
- Android SQLite存储——个人日记本开发(二):添加、删除功能的实现
- Android手机实现GPS语音导航功能(Google地图导航)
- (转)Android中实现Launcher功能之一 ----- 添加快捷方式
- Android 删除手机联系人,添加手机联系人,更新手机联系人信
- 四十七、实现调用Android手机的拍照功能
- Android中实现Launcher功能之一 ----- 添加快捷方式
- Android 手机震动功能实现