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;
	}

 

这里有个问题,如果是修改分组的联系人,我这里是每个都去修改一次,效率上有问题,应该如何优化?

posted @ 2013-08-02 15:43  走正路  阅读(996)  评论(0)    收藏  举报