Android:插入后获取联系人ID

Posted

技术标签:

【中文标题】Android:插入后获取联系人ID【英文标题】:Android: get contact id after insert 【发布时间】:2014-06-24 16:13:39 【问题描述】:

我需要在创建新联系人后存储联系人 id 值,以便在其他时候能够引用它。例如,我创建了一个新联系人,然后我想将其从其联系人 ID 中删除,因此我需要在创建新联系人后检索联系人 ID 值。这就是我创建新联系人的方式:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, tipoCuenta).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, cuenta).build());

//Insert some data here....

c.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

//Here, I want to retrieve contact id

我该怎么做?

【问题讨论】:

你能详细说明一下吗..你遇到了什么问题 【参考方案1】:

ContentResolver.applyBatch() 方法返回一个由ContentProviderResult 对象组成的数组,每个操作一个对象。其中每一个都有插入的联系人的 uri(格式为 content://com.android.contacts/raw_contacts/&lt;contact_id&gt;)。

所以要获取联系人的 id,你只需要解析这个 uri,即

ContentProviderResult[] results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
int contactId = Integer.parseInt(results[0].uri.getLastPathSegment());

【讨论】:

我建议使用 ContentUris.parseId(contentProviderResult.uri);从 ContentProvider 获取资源的 id。 致不知情的人。此解决方案返回 RAW_CONTACT_ID,而不是 CONTACT_ID。【参考方案2】:

改进 matiash 答案:

ContentResolver.applyBatch() 方法返回一个由ContentProviderResult 对象组成的数组,每个操作一个对象。如果您的第一个操作添加了 RawContact,则结果数组的第一个元素将包含添加 RawContact 的 uri(格式为 content://com.android.contacts/raw_contacts/[raw_contact_id])。

如果您对 raw_contact_id 感兴趣,那么以下内容就足够了:

    final ContentProviderResult[] results = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    long rawContactId = ContentUris.parseId(results[0].uri);

但某些设备上的 raw_contact_id 可能与 contact_id 不同 - 要获得 contact_id,您必须执行以下操作:

    final ContentProviderResult[] results = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    final String[] projection = new String[]  ContactsContract.RawContacts.CONTACT_ID ;
    final Cursor cursor = contentResolver.query(results[0].uri, projection, null, null, null);
    cursor.moveToNext();
    long contactId = cursor.getLong(0);
    cursor.close();

【讨论】:

这个答案拯救了我的一天!太感谢了!使用其他答案时,我总是得到与创建结果不同的 id。但 id 实际上是另外一回事。正是这个解决方案产生的。再次感谢 【参考方案3】:

这里是我使用的一段代码

    newContactUri = null;
    try 
        ContentProviderResult[] res = globalContext.getContentResolver()
                .applyBatch(ContactsContract.AUTHORITY, ops);
        if (res != null && res[0] != null) 
            newContactUri = res[0].uri;
            /**
             * als Ergebnis erhaelt man eine URI, mit der man die raw
             * contact-id auslesen kann.
             */
            if (debug) 
                Log.d(TAG, "URI added contact:" + res[0].uri.toString()
                        + " l: " + res.length);
            

            subQuery(newContactUri); // setzt contactRawID

         else if (debug)
            Log.e( ....);

     catch (Exception e) 
        if (debug)
            Log.d( .... );
    

这是子程序 subQuery

/**
 * <pre>
 * nachdem ein user angelegt ist, wird damit 
 * die contactRawID gesetzt 
 * 
 * @param contactUri
 *            ... Ergebnis aus ContentProviderResult
 * @return void
 * </pre>
 */
public void subQuery(Uri contactUri) 
    if (debug)
        Log.i(TAG, "subQuery() ");

    contactRawID = -2;
    // Content Resolver
    String contactIdString = null;
    String displayName = null;
    ContentResolver contentResolver = globalContext.getContentResolver();
    String[] mainQueryProjection =  ContactsContract.RawContacts._ID,
            ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY ;

    Cursor subQueryCursor = contentResolver.query(contactUri,
            mainQueryProjection, null, null, null);
    if (subQueryCursor != null) 
        if (debug)
            Log.d(TAG, "subQueryCursor != null ");
        while (subQueryCursor.moveToNext()) 
            contactIdString = subQueryCursor.getString(0);
            displayName = subQueryCursor.getString(1);
        
        ;
        try 
            subQueryCursor.close();
         catch (Exception e) 
            if (debug)
                Log.d(TAG, .... );
        
        contactRawID = Integer.parseInt(contactIdString);
    
    return;

很多人对德语评论文本感到抱歉 但我希望这会有所帮助

【讨论】:

以上是关于Android:插入后获取联系人ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在以编程方式将 newInsert 插入地址簿后获取最后插入的 RawContacts ID?

Android快速获取联系人

如何从 Android 联系人中的联系人 ID 获取只读帐户名称

android获取联系人图片、姓名和手机号码

从 Android 中的 URI 检索联系人电话号码

获取 Android 手机联系人的跨设备唯一 ID