使用Intent.ACTION_EDIT 編輯聯繫人問題!

參看官方文檔:http://developer.android.com/guide/topics/providers/contacts-provider.html#AccessRetrieval and modification with intents 部分 html

本文討論的是編輯指定的聯繫人,不然你應該使用Intent.ACTION_INSERT_OR_EDIT java

涉及到的Action是:Intent.ACTION_EIDT
涉及到的Provider契約類常量是:
Contacts.CONTENT_LOOKUP_URI  指定相關聯繫人的URI
Contacts.CONTENT_ITEM_TYPE  指定聯繫人的MIME類型 android

重點是如何構建一個指定聯繫人的Contacts.CONTENT_LOOKUP_URI app

官網對Contacts.CONTENT_LOOKUP_URI的說明是: ide

A content:// style URI for this table that should be used to create shortcuts or otherwise create long-term links to contacts. This URI should always be followed by a "/" and the contact's LOOKUP_KEY. It can optionally also have a "/" and last known contact ID appended after that. This "complete" format is an important optimization and is highly recommended. ui

As long as the contact's row ID remains the same, this URI is equivalent to CONTENT_URI. If the contact's row ID changes as a result of a sync or aggregation, this URI will look up the contact using indirect information (sync IDs or constituent raw contacts). this

Lookup key should be appended unencoded - it is stored in the encoded form, ready for use in a URI. spa

以上大體意思是,能夠經過以下兩種方式構建: code

第一種: orm

Uri content_lookup_uri = UriContentUris.withAppendedId(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,lookupKey), contactId);
// contactId爲可選參數,能夠直接寫成以下形式
Uri content_lookup_uri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,lookupKey);

第二種:

Uri content_lookup_uri = UriContentUris.withAppendedId(Contacts.CONTENT_URI,contactId);
/*
注意:這裏用的是Contacts.CONTENT_URI不是Contacts.CONTENT_LOOKUP_URI,不然會出現異常:
ContactLoader﹕ Error loading the contact: content://com.android.contacts/contacts/lookup/159
    java.lang.IllegalArgumentException: Invalid lookup id: 159 
*/

首先是如何得到聯繫人的LOOKUP_KEY和ID,一般狀況下,當你使用Intent.ACTION_EDIT方式時,說明你已經拿到了一個CONTENT_LOOKUP_URI,爲了對以上代碼更好的說明和方便起見咱們經過以下代碼塊打開聯繫人應用,從中挑選一個聯繫人加以說明:

public static final int REQUEST_CODE = 1;
//...........
Intent pick_Contact = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(pick_Contact, REQUEST_CODE);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Uri content_lookup_uri = data.getData(); // 這裏拿到的content_lookup_uri 就是採用第一種方式構建的
        super.onActivityResult(requestCode, resultCode, data);
    }

經過以上步驟就拿到了content_lookup_uri,經過下面代碼塊來對指定聯繫人進行編輯

Intent editIntent = new Intent(Intent.ACTION_EDIT);
/* 
注意:當既要給Intent設置Data屬性又要設置Type屬性時,必須使用setDataAndType()方法
不然會獲得異常:
(Error loading the contact: null java.lang.IllegalArgumentException: uri must not null)
例如,使用setData()而後再使用setType(),後者方法會清除前者設置的屬性。或者在new Intent對象時,使用的構造方法是:
Intent(String action, Uri uri)或者
Intent(String action, Uri uri,Context packageContext, Class<?> cls)而後使用setType()設置的屬性
以上請參見源碼註釋或文檔
*/
editIntent.setDataAndType(content_lookup_uri2,ContactsContract.Contacts.CONTENT_ITEM_TYPE);
startActivity(editIntent);

固然多數時候咱們直接使用Intent.ACTION_INSERT_OR_EDIT來編輯聯繫人 本文只是討論在使用Intent.ACTION_EDIT時的注意事項

相關文章
相關標籤/搜索