android 联系人更新,android – 新联系人创建而不是更新现有联系人

我正在将我的应用程序与Android默认联系人应用程序集成.我想在每个联系人详细信息中显示选项“xyz using MyApp”.我能够在Accounts Section中看到我的应用程序,其中包含同步联系人的选项,但我的应用程序仍未合并使用现有联系人,而是创建新联系人并合并其中.

performSync()方法

private static void addContact(ContentResolver contentResolver,int name, int phoneNumber) {

Log.i("XYZ", "Adding contact: " + name);

ArrayList operationList = new ArrayList();

//Create our RawContact

ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI);

builder.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, name);

builder.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "com.example.xyz.myapplication");

builder.withValue(ContactsContract.RawContacts.SYNC1, phoneNumber);

operationList.add(builder.build());

//Create a Data record of common type 'StructuredName' for our RawContact

builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);

builder.withValueBackReference(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, 0);

builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);

builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);

operationList.add(builder.build());

//Create a Data record of custom type "vnd.android.cursor.item/vnd.com.example.xyz.myapplication.profile" to display a link to the Last.fm profile

builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);

builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);

builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.com.example.xyz.myapplication.profile");

builder.withValue(ContactsContract.Data.DATA1, phoneNumber);

builder.withValue(ContactsContract.Data.DATA2, "Last.fm Profile");

builder.withValue(ContactsContract.Data.DATA3, "View profile");

operationList.add(builder.build());

try {

contentResolver.applyBatch(ContactsContract.AUTHORITY, operationList);

} catch (Exception e) {

Log.e("XYZ", "Something went wrong during creation! " + e);

e.printStackTrace();

}

}

解决方法:

在您的addContact代码中,您缺少告诉Contacts DB将新的原始联系人加入现有联系人的部分,以便该联系人现在将包含您的原始联系人,并且在打开该联系人时将显示您的特定于应用程序的行.联系人应用.

您可能需要将一些RawContact ID传递给addContact方法,这样它才能将两者连接在一起.

UPDATE

我们不是将聚合操作与RawContact插入操作一起应用,而是尝试将两个applyBatch调用分开,让我们将所有现有原始联系人的新原始联系人聚合,而不仅仅是其中一个.

请尝试以下代码,确保将现有的contact-id(非raw-contact id)和新的raw-contact-id传递给它.

private void joinIntoExistingContact(long existingContactId, long newRawContactId) {

// get all existing raw-contact-ids that belong to the contact-id

List existingRawIds = new ArrayList<>();

Cursor cur = getContentResolver().query(RawContacts.CONTENT_URI, new String[] { RawContacts._ID }, RawContacts.CONTACT_ID + "=" + existingContactId, null, null);

while (cur.moveToNext()) {

existingRawIds.add(cur.getLong(0));

}

cur.close();

Log.i("Join", "Found " + existingRawIds.size() + " raw-contact-ids");

List ops = new ArrayList();

// go over all existing raw ids, and join with our new one

for (Long existingRawId : existingRawIds) {

Builder builder = ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI);

builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);

builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, newRawContactId);

builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, existingRawId);

ops.add(builder.build());

}

contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);

}

另一个更新

你似乎对ID有些困惑.

有数据ID,RawContact ID和联系人ID.

CommonDataKinds.Phone._ID将返回一个数据ID,用于标识存储该电话号码的数据表中的特定行.

您也可以从Phone表中获取其他ID,使用:

CommonDataKinds.Phone.RAW_CONTACT_ID

CommonDataKinds.Phone.CONTACT_ID

标签:accountmanager,android-syncadapter,android,service,contacts

来源: https://codeday.me/bug/20191002/1843655.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值