在Android 2.2中插入联系人

我试图插入新的RawContact联系人,但添加的RawContact不显示当我通过联系人或电话簿查看联系人。 据我了解,如果我们创build一个RawContact ,并没有联系与它联系,那么联系人将被自动插入。 我得到了一个有效的rawContactId值,并且没有抛出exception,所以我假定插入是成功的。 我做错了什么,或者我错过了什么? 我正在使用开发者网站的代码示例,只是粘贴在这里:

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

我以为这个问题早已被人遗忘了,但是由于有人高估了这个问题,我认为别人也面临着和我一样的问题。 经过一番斗争,我能够找出问题并插入联系人,希望这有助于,这里是示例代码:

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

一位客户向我报告,上述答案(Als)中的解决scheme在某些HTC设备上不起作用。 所以经过几天的沮丧,我想出了这个解决scheme:

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

要创build一个可见的联系人,它需要属于一个可见的组。 看看你的计算机上的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); } 

要将组添加到rawContact:

  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.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:

我不明白你的答案中的第三段,它说:

values.put(Data.MIMETYPE,Data.CONTENT_TYPE)…

没有这样的MIMETYPE。 (我检查了运行HTC Android 2.2的HTC Desire)。

谢谢。