Почему такие приложения, как Duo, WhatsApp, Skype, имеют записи в таблице RawContact нативных контактов - PullRequest
3 голосов
/ 28 мая 2019

Я использую ContactContracts API для извлечения записей в таблице RawContacts

private void fetchRawContactEntries() {
        String [] mProjectionColumns = new String [] {
            RawContacts.CONTACT_ID, RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE, RawContacts.DISPLAY_NAME_PRIMARY
        };

        Cursor c = getContentResolver().query(RawContacts.CONTENT_URI, mProjectionColumns, null, null,
                RawContacts.DISPLAY_NAME_PRIMARY + " ASC");
        if(c != null) {
            while(c.moveToNext()) {
                long contactId = c.getLong(0);
                String accountName = c.getString(1);
                String accountType = c.getString(2);
                String displayName = c.getString(3);

                Log.d("Logs", contactId +  ", accountName:" + accountName + ", Display Name : " + displayName);
            }
        }
    }

Я вижу, что у каждого контакта есть несколько записей в таблице raw_contacts.(Gmail, Duo и т. Д.)

2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:kartikayemail@gmail.com, Display Name : Abhay Y
2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:WhatsApp, Display Name : Abhay Y
2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:Duo, Display Name : Abhay Y
2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:Duo, Display Name : Abhay Y
2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:kartik@gmail.com, Display Name : Abhayuday
2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:WhatsApp, Display Name : Abhayuday
2019-05-28 19:21:15.484 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:Duo, Display Name : Abhayuday
2019-05-28 19:21:15.484 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:Duo, Display Name : Abhayuday

Infact Duo делает две разные записи в таблице RawContact.Как приложение native contact различает эти записи.
Я знаю, что они показывают записи таблицы контактов , но когда изменяет данные, которые raw_contact_id выбирают из Duo or Whatsapp or gmail,Откуда они берут эти оригинальные raw_contact_id ?

Вот вещи, которые я уже знаю:

  1. Идентификатор контакта повторяющихся записей будетбыть одинаковыми независимо от источников, которые обрабатываются поставщиком контактов.Проверьте это ContactsAggregator
  2. В таблице контактов есть столбец name_raw_contact_id, в котором указан соответствующий _ID таблицы RawContacts (однако я не уверен, может ли это рассматриваться в качестве основной записи дляконтакт в таблице RawContacts).

Ниже приводится список вещей, которые я хочу знать:

  1. Мы можем получить уникальные контакты изContactsContract.Contact таблица, но для того, чтобы изменить / удалить значения данных (например, телефон, электронная почта и т. Д.), Используя поставщика провайдеров, какой raw_contact_id мы можем выбрать?или я могу пойти и изменить непосредственно в таблице ContactContract.Data.
  2. Как WhatsApp обнаруживает добавление / изменение контакта.Насколько я знаю, поставщик контактов не предоставляет _ID для добавления новых контактов.Обновляют ли они свой список контактов после каждого запуска приложения или через равные промежутки времени?
  3. Как получить исходный источник для контакта (возможно, gmail / native в моем случае) и исключить копии, созданные такими приложениями, как Duo, Skype, WhatsApp, с помощью поставщика контактов.

Было бы здорово, если бы кто-нибудь помог мне понять это.Не стесняйтесь рекомендовать любой другой канал, где я могу задать эти вопросы

1 Ответ

2 голосов
/ 29 мая 2019

Проекция действительно неверна.

БД контактов организована в трех основных таблицах:

  1. Contacts - каждая запись представляет один контакт и группирует один или несколькоRawContacts
  2. RawContacts - каждая запись представляет данные о контакте, который был синхронизирован некоторыми SyncAdapter (например, Whatsapp, Google, Facebook, Viber), при этом группируются несколько записей данных
  3. Data - фактические данные о контакте, адресах электронной почты, телефонах и т. Д. Каждая строка представляет собой отдельный фрагмент данных, принадлежащий одному RawContact

Каждому приложению в Google Play с достаточным количествомВ разрешениях можно добавить новый контакт или новый RawContact и объединить его в существующий контакт, точно так же как Whatsapp / Duo, это позволяет каждому приложению хранить информацию о конкретном контакте, например, идентификатор WhatsApp, или любую другую информацию, которая будет полезна дляприложение.

Вы ошибочно полагаете, что существует один «главный» RawContact, который является важным, а остальные присоединены к нему.Вместо этого, список RawContacts, представляющий один контакт, может содержать несколько Google RawContacts с одинаковой важностью или вообще не иметь Google RawContacts, есть одно различие, которое может помочь вам выбрать RawContact для редактирования, а именно, является ли RawContacts созданнымприложение доступно только для чтения или для записи.

Вот код для перебора всех учетных записей на устройстве и просмотра, которые доступны только для чтения и которые можно изменять (supportsUploading):

final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
for (SyncAdapterType sync : syncs) {
    Log.d(TAG, "found SyncAdapter: " + sync.accountType);
    if (ContactsContract.AUTHORITY.equals(sync.authority)) {
        Log.d(TAG, "found SyncAdapter that supports contacts: " + sync.accountType);
        if (sync.supportsUploading()) {
            Log.d(TAG, "found SyncAdapter that supports contacts and is not read-only: " + sync.accountType);
            // we'll now get a list of all accounts under that accountType:
            Account[] accounts = AccountManager.get(this).getAccountsByType(sync.accountType);
            for (Account account : accounts) {
               Log.d(TAG, account.type + " / " + account.name);
            }
        }
    }
}

Изучите другие полезные вещи в SyncAdapterType, например isUserVisible, которые также могут вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...