当一个联系人被更新为批量操作时 "context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);"
那么其他应用程序,如WhatsApp不会自动更新。
例如,如果手机号码被更新为:-。
String deviceNumber= "+1 (234) 56789";
String oldTrimmed= "+123456789";
String where = ContactsContract.CommonDataKinds.Phone.NUMBER + " = ? OR " + ContactsContract.CommonDataKinds.Phone.NUMBER + " = ? AND " + ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] args = {oldTrimmed, deviceNumber, contactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(where, args)
.build()
);
那么旧号码在手机上仍然显示为WhatsApp号码。
有没有什么方法可以在更新后触发手机联系人的同步,让其他应用也能自动同步。
在以编程方式更新联系人信息的同时,你还应该触发同步,这样所有的适配器就可以同步了。
这可以通过以下方式实现:-
private void requestSync()
{
AccountManager am = AccountManager.get(context);
Account[] accounts = am.getAccounts();
for (Account account : accounts)
{
int isSyncable = ContentResolver.getIsSyncable(account, ContactsContract.AUTHORITY);
if (isSyncable > 0)
{
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(accounts[0], ContactsContract.AUTHORITY, extras);
}
}
}
这段代码将获取被添加到设备的联系人应用中的账户,如 "WhatsApp "和 "Google",并请求同步。
权限应该被添加为
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
Whatsapp不是 "基于联系人 "的,而是 "基于电话号码 "的,也就是说,如果您改变了联系人A的电话号码,它不会改变与该联系人的现有对话(因为该对话的 "关键 "是电话号码)。
另外请注意,您可以和那些没有存储在您本地联系人中的电话号码进行对话。
Whatsapp有它的 同步适配器 就像大多数其他对Android通讯录DB进行读写的应用一样,每个应用都可以决定是否要在发生变化时被唤醒并同步.据我所知,Whatsapp不会在每次变化时被唤醒并同步,而是周期性地进行,并且可以由用户手动触发(撰写新消息>;菜单>;刷新)。
所以总结一下你的最新联系方式 是 与其他应用程序同步,但在 其 术语不是你的。