Android: программно обновленный контакт не синхронизируется с другими приложениями - PullRequest
0 голосов
/ 27 апреля 2020

Когда контакт обновляется с помощью пакетной операции "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.

Есть ли способ активировать синхронизацию c для мобильных контактов после любого обновления, чтобы другие приложения также могли синхронизироваться автоматически.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Whatsapp не «на основе контакта», а «на основе номера телефона», что означает, что если вы измените номер телефона контакта А, он НЕ изменит существующий разговор с этим контактом (так как «ключ» этого разговора - номер телефона ).

Также обратите внимание, что вы можете разговаривать с телефонными номерами, которые вообще не сохраняются в ваших локальных контактах.

Whatsapp имеет свой SyncAdapter , как и большинство других приложений. что для чтения / записи в базу данных Android Contacts каждое приложение может решить, будет ли оно активировано, и синхронизировать c при каждом изменении. WhatsApp, насколько я знаю, не просыпается и не синхронизирует c каждое изменение, вместо этого он периодически делает это и может запускаться пользователем вручную (создать новое сообщение> menu> refre sh)

Итак, если ваш обновленный контакт будет синхронизироваться с другими приложениями, но на их условия не ваши.

0 голосов
/ 27 апреля 2020

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

Это можно сделать следующим образом: -

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" />

...