我目前正在开发一个应用程序,需要将联系人插入手机联系人列表。使用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吗?
提前感谢您能给我的任何帮助。
更好的方法,您可以获得_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();
}
它对我有效。
当然可以!这是:
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();
}