在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)。
谢谢。
- Html.fromHtml()已被弃用,替代方法是什么?
- Android Studio:Gradle – 构build失败 – 任务执行失败':dexDebug'
- 任何方式来发现您的networking上的Android设备?
- java.lang.IllegalStateException:片段不附加到活动
- URLConnection或HTTPClient:提供更好的function和更高的效率?
- 你如何获得ViewPager for Android的当前页码?
- Android:以编程方式View.setID(int id) – 如何避免ID冲突?
- Android Studio:如何使用Gradle生成签名的apk?
- 如何从Android移动应用程序调用本地Web服务