在Android 2.2中插入联系人

在Android 2.2中插入联系人,android,android-contacts,Android,Android Contacts,我正在尝试插入新的RawContact联系人,但通过联系人或电话簿查看联系人时,添加的RawContact不会显示。据我所知,如果我们创建了一个RawContact,并且没有与之关联的联系人,那么该联系人将自动插入。我得到一个有效值rawContactId,并且没有抛出异常,因此我假设插入成功。我是做错了什么还是遗漏了什么?我正在使用开发者网站上的代码示例,只是将其粘贴到这里: ContentValues values = new ContentValues(); values.put(Ra

我正在尝试插入新的
RawContact
联系人,但通过联系人或电话簿查看联系人时,添加的
RawContact
不会显示。据我所知,如果我们创建了一个
RawContact
,并且没有与之关联的联系人,那么该联系人将自动插入。我得到一个有效值
rawContactId
,并且没有抛出异常,因此我假设插入成功。我是做错了什么还是遗漏了什么?我正在使用开发者网站上的代码示例,只是将其粘贴到这里:

 ContentValues values = new ContentValues();
 values.put(RawContacts.ACCOUNT_TYPE, accountType); 
 values.put(RawContacts.ACCOUNT_NAME, accountName);
 Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); 
 long rawContactId = ContentUris.parseId(rawContactUri); 

 values.clear(); 
 values.put(Data.RAW_CONTACT_ID, rawContactId); 
 values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 
 values.put(StructuredName.DISPLAY_NAME, "Mike Sullivan"); 
 getContentResolver().insert(Data.CONTENT_URI, values); 

我以为这个Q早就被遗忘了,但既然有人投票支持它,我想其他人也会面临和我一样的问题。经过一番努力,我终于找到了问题所在并插入了联系人,希望这能有所帮助,以下是示例代码:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();

ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
   .withValue(RawContacts.ACCOUNT_TYPE, null)
   .withValue(RawContacts.ACCOUNT_NAME,null )
   .build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
   .withValue(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
   .withValue(Phone.NUMBER, "9X-XXXXXXXXX")
   .build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
   .withValue(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE)
   .withValue(StructuredName.DISPLAY_NAME, "Mike Sullivan")
   .build());  
ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
ArrayList ops=new ArrayList();
int rawContactInsertIndex=ops.size();
添加(ContentProviderOperation.newInsert(RawContacts.CONTENT\uURI)
.withValue(RawContacts.ACCOUNT_类型,null)
.withValue(RawContacts.ACCOUNT\u名称,空)
.build());
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,RAW contacts insertindex)
.withValue(数据.MIMETYPE,电话.CONTENT\u ITEM\u TYPE)
.带值(电话号码,“9X-XXXXXXXXX”)
.build());
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带ValueBackReference(Data.RAW\u CONTACT\u ID,RAW contactInsertIndex)
.withValue(Data.MIMETYPE、StructuredName.CONTENT\u ITEM\u TYPE)
.withValue(StructuredName.DISPLAY_NAME,“Mike Sullivan”)
.build());
ContentProviderResult[]res=getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);

一位客户向我报告,上述答案中的解决方案(由Als提供)在某些HTC设备上不起作用。因此,在经历了几天的挫折之后,我想出了这个解决方案:

String name = "First Family";
String phone = "0123456789";
ContentValues values = new ContentValues();
values.put(Data.DISPLAY_NAME, name);
Uri rawContactUri = c.getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
long contactId = Util.getContactId(c, rawContactId);
System.out.println("rawContactId = " + rawContactId);
System.out.println("contactId = " + contactId);

values.clear();
values.put(Phone.NUMBER, phone);
values.put(Phone.TYPE, Phone.TYPE_OTHER);
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Data.RAW_CONTACT_ID, rawContactId);
c.getContentResolver().insert(Data.CONTENT_URI, values);

values.clear();
values.put(Data.MIMETYPE, Data.CONTENT_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
values.put(Data.RAW_CONTACT_ID, rawContactId);
c.getContentResolver().insert(Data.CONTENT_URI, values);

values.clear();
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
values.put(Data.RAW_CONTACT_ID, rawContactId);
c.getContentResolver().insert(Data.CONTENT_URI, values);



public static long getContactId(Context context, long rawContactId) {
    Cursor cur = null;
    try {
        cur = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, new String[] { ContactsContract.RawContacts.CONTACT_ID }, ContactsContract.RawContacts._ID + "=" + rawContactId, null, null);
        if (cur.moveToFirst()) {
            return cur.getLong(cur.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cur != null) {
            cur.close();
        }
    }
    return -1l;
}

要创建可见联系人,它需要属于可见组。查看电脑上的gmail联系人,查看群组和可见性

要在设备上查找可见组,请执行以下操作:

    Long myContactsGroupId = null;
    sqlWhere = ContactsContract.Groups.ACCOUNT_TYPE + " = 'com.google'  AND  " + ContactsContract.Groups.GROUP_VISIBLE + " = 1";
    Cursor cursor = getContentResolver().query(ContactsContract.Groups.CONTENT_URI, new String[] {"_id"}, sqlWhere, null, "_id");
    if (cursor.moveToFirst()) {
        myContactsGroupId = cursor.getLong(0);
    }
要将组添加到联系人,请执行以下操作:

        cv.clear();
        cv.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE);
        cv.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, myContactsGroupId);
        cv.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, cv);
或ops版本:

         ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, myContactsGroupId)
                .build());
@anqe1ki11er:

我不明白你回答的第三段说:

value.put(Data.MIMETYPE、Data.CONTENT\u TYPE)

没有这样的模拟类型。(我在运行HTC安卓2.2的HTC Desire上进行了检查)


谢谢。

@anqe1ki11er:您确定标记为“解决方案”的答案(不是Q中的答案)无效吗?因为它在摩托罗拉设备上对我有效。我的一位客户向我报告说,您的解决方案在一些较新的HTC设备上不起作用。我不知道是哪一个。但是我看到了堆栈跟踪,所以我很确定下面的答案并不适用于所有设备。如果有帮助,我知道我的客户端使用deviceanywhere进行测试。@shesjulie您不必导入任何类,Util.getContactId()是我自己的方法,其代码如下。抱歉,我忘了在我的第一篇文章中包含它。public static long getContactId(Context Context,long rawContactId){Cursor cur=null;尝试{cur=Context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,新字符串[]{ContactsContract.RawContacts.CONTACT_ID},contacts.RawContacts.\u ID+“=”+rawContactId,null,null);if(cur.moveToFirst()){return cur.getLong(cur.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));}}catch(异常e){e.printStackTrace();}最后{if(cur!=null){cur close();}return 1l;}@Als:是的,您的代码在仿真器和几乎所有设备上都能完美工作。所以我同意你的观点,这是HTC的错,他们可能修改了联系人框架。这个解决方案直接添加了联系人。有没有办法用一些预填充的数据(包括StructuredName)启动android“添加联系人”活动?如果是这样,您是否愿意在这里回答:如果我使用“null”作为帐户名并键入,则在三星手机上执行applyBatch时会出现错误。这方面有什么更新吗?很好用。请让我知道在插入联系人后如何获取contactid为什么要添加两次联系人?要导入哪些数据?Contacts contract.Data、Contacts contract.Contacts.Data或Contacts contract.raw Contacts.Data谢谢,ops版本拯救了我的一天!!另外,它与android 4.2.3配合使用。