android 学习笔记1--修改来电铃声
修改联系人的来电铃声
1、调用系统的设置弹框,拿到用户选择铃声url,再自己手动写入数据库中。
/**
* 调用系统选择铃声界面
* @param activity
*/
public static final int RINGTONE_REQUEST_CODE = 111;
public void chooseRingtong(Activity activity,String mCustomRingtone){
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);
}
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
// Launch!
activity.startActivityForResult(intent, RINGTONE_REQUEST_CODE);
}
其中,mCustomRingtone 是当前铃声的url,可以在查询联系人数据库的时候获取custom_ringtone字段。默认铃声为null。
String selectFormRawContacts = "select _id from raw_contacts where deleted = 0";
String whereStr = " raw_contact_id in (" + selectFormRawContacts + ")"
+ " and mimetype in (?,?,?,?) and (" + RawContacts.ACCOUNT_NAME
+ "!='SIM1' and " + RawContacts.ACCOUNT_NAME + "!='SIM2' ) "
+ " or " + RawContacts.ACCOUNT_NAME + " is null";
Cursor cursor = null;
ContentResolver resolver = context.getContentResolver();
cursor = resolver.query(ContactsContract.Data.CONTENT_URI, null,whereStr, new String[] {
"vnd.android.cursor.item/name"
,"vnd.android.cursor.item/phone_v2"
,"vnd.android.cursor.item/vnd.com.tencent.mm.plugin.sns.timeline"
,"vnd.android.cursor.item/vnd.com.tencent.mm.chatting.profile"
},"contact_id desc");
while (cursor != null && cursor.moveToNext()) {
String custom_ringtone = cursor.getString(cursor.getColumnIndex(custom_ringtone));
////其他各个联系人字段
}
在onActivityResult 接收返回的铃声url,写入数据库
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case RingtongUtil.RINGTONE_REQUEST_CODE:
if(data == null)
return;
Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
ringtongUtil.handleRingtonePicked(mContact, pickedUri);
ringtongUtil.setContactRingtong(PersonCardActivity.this,mContact.getRaw_contact_id(),pickedUri.toString());
break;
}
}
其中,ringtongUtil.handleRingtonePicked(mContact, pickedUri);是对内存数据的更新。
public void handleRingtonePicked(ContactsBean mContacts, Uri pickedUri) {
if (mContacts == null )
return;
if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
mContacts.setCustomRingtone(null);
} else {
mContacts.setCustomRingtone(pickedUri.toString());
}
}
ringtongUtil.setContactRingtong(PersonCardActivity.this,mContact.getRaw_contact_id(),pickedUri.toString());是调用dao类修改手机数据库中的数据
new RingtongDao().setGroupRingtong(GroupDetailActivity.this,mGroupBean.getGroup_id(),ringtongUrl);
public class RingtongDao {
//set group ringtong
public void setGroupRingtong(Context context, long groupId,String ringtongUri){
updateGroupRing(context,groupId,ringtongUri);
}
public void setContactRingtong(Context context,int contactsRawId,String ringtongUri){
updateContactRing(context,contactsRawId,ringtongUri);
}
public static void updateContactRing(Context context, long uid, String ringtongUri) {
ContentValues values = new ContentValues();
Uri mLookupUri = ContactsContract.RawContacts.getContactLookupUri(
context.getContentResolver(),
ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, uid));
if (TextUtils.isEmpty(ringtongUri))
ringtongUri = null;
values.put(ContactsContract.RawContacts.CUSTOM_RINGTONE, ringtongUri);
context.getContentResolver().update(mLookupUri, values, null, null);
}
private static void updateGroupRing(final Context context, final long groupId, final String ringtongUri){
new Thread(new Runnable() {
public void run() {
final List<ContactsBean> list = GroupUtils.getInstance().getGroupContact(context,groupId);
if(list == null){
return;
}
for (ContactsBean newContactsBean : list) {
if (newContactsBean == null || newContactsBean.getRaw_contact_id() == 0) {
return;
}
//设置群组铃声
updateContactRing(context, newContactsBean.getRaw_contact_id(), ringtongUri);
}
}
}).start();
}
}
这个dao类通过context.getContentResolver()直接修改数据库。
如果是修改分组的铃声,手机数据库没有这个字段,所以只能找到分组的联系人,一个个给他们设置了。而联系人的铃声则需要保存到本地。
/**
* 根据id获取分组底下的联系人
*
* @param c
* @param groupId
* @return
*/
public List<ContactsBean> getGroupContact(Context c, long groupId) {
List<Integer> ids = new ArrayList<Integer>();
Cursor cursor = null;
try {
cursor = c.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
"mimetype=? and data1=?",
new String[] { "vnd.android.cursor.item/group_membership",
groupId + "" }, null);
while (cursor.moveToNext()) {
int raw_contact = cursor.getInt(cursor
.getColumnIndex("raw_contact_id"));
ids.add(raw_contact);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
List<ContactsBean> result = new ArrayList<ContactsBean>();
if (ids != null && !ids.isEmpty()) {
List<ContactsBean> contacts = DataManager.getInstance(
c.getApplicationContext()).getContactsAll();
if (contacts == null) {
ContactsDBImpl contactsDBImpl = new ContactsDBImpl();
contacts = contactsDBImpl.readContacts(c);// 获取所有的联系人数据
}
if (contacts != null && contacts.size() > 0) {
for (ContactsBean contactsBean : contacts) {
if (ids.contains(contactsBean.getRaw_contact_id())) {
result.add(contactsBean);
ids.remove((Integer) contactsBean.getRaw_contact_id());
}
}
}
}
return result;
}
这里有个问题,如果是修改分组的联系人,我这里是每个都去修改一次,效率上有问题,应该如何优化?

浙公网安备 33010602011771号