Вставка контактов в Android 2.2

Я пытаюсь вставить новые контакты 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); 

Solutions Collecting From Web of "Вставка контактов в Android 2.2"

Я думал, что этот 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); 

Клиент сообщил мне, что решение в ответе выше (от 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); } 

Чтобы добавить группу в 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:

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

Нет такого МИМЕТИПА. (Я проверил его на HTC Desire под управлением HTC Android 2.2).

Благодарю.