на контактной вставке получить Contact_ID - PullRequest
0 голосов
/ 27 марта 2012

В настоящее время я работаю над приложением, в котором мне нужно вставить контакты в список контактов мобильных телефонов.Используя пакетную вставку ContactsContract.RawContacts, я успешно вставил контакты в телефонную книгу.

http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

Однако, пытаясь обновить их, они просто добавляют дополнительный номер телефона, вместо того, чтобы заменить старый.

Итак, я пришел на ContactsContract.Data, где через Contact_ID можно было, по-видимому, при обновлении заменить старый номер телефона.

http://developer.android.com/reference/android/provider/ContactsContract.Data.html

Теперь у меня вопрос, возможно ливосстановить Contacts_ID при вставке?Так что, когда я вставляю контакт по этому коду:

ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();
 ...
 int rawContactInsertIndex = ops.size();
 ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
          .withValue(RawContacts.ACCOUNT_TYPE, accountType)
          .withValue(RawContacts.ACCOUNT_NAME, accountName)
          .build());

 ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
          .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
          .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
          .withValue(StructuredName.DISPLAY_NAME, "Mike Sullivan")
          .build());

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

Я получу обратно Contacts_ID?

Спасибо заранее за любую помощь, которую вы можете мне дать.

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Лучше, и вы получите _ID, а не RAW_ID !!

Добавьте это как статические переменные:

static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.Contacts.STARRED,
    ContactsContract.Contacts.TIMES_CONTACTED,
    ContactsContract.Contacts.CONTACT_PRESENCE,
    ContactsContract.Contacts.PHOTO_ID,
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts.HAS_PHONE_NUMBER,
};

Затем добавьте это после вставки:

// Displayed name
String displayed_name = "Contact's name goes here";

// Add the new contact
try
{
    context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e)
{
    e.printStackTrace();
}

String select = "(" + ContactsContract.Contacts.DISPLAY_NAME + " == \"" +displayed_name+ "\" )";
Cursor c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
context.startManagingCursor(c);

if (c.moveToNext())
{
    int id = new Integer(c.getString(0)).intValue();
}

У меня это работает.

0 голосов
/ 27 марта 2012

Конечно, вы можете!Вот оно:

ContentProviderResult[] res;
try
{
    res = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    if (res != null && res[0] != null)
    {
        String uri = res[0].uri.getPath().substring(14);
        int contact_id = new Integer(uri).intValue());
    }
}
catch (RemoteException e)
{
    e.printStackTrace();
}
catch (OperationApplicationException e)
{
    e.printStackTrace();
}
...