Как изменить поле ACCOUNT_TYPE для конкретного существующего контакта с одним из Google и синхронизировать его?

Фон

Предположим, у меня есть контакт на устройстве (или я собираюсь его создать), который я хочу сохранить в учетной записи Google, чтобы он синхронизировался с ним. Я также хочу, чтобы пользователь мог выбирать, в какую учетную запись сохранять.

Вот что показывает устройство Samsung при создании нового контакта:

введите здесь описание изображения

Если на устройстве также есть учетная запись Samsung, она также будет отображаться в этом диалоговом окне.

Эта проблема

Я узнал, как вставить новый (здесь), но насколько я помню , изменение существующего контакта разрешено только в определенных случаях (возможно, только если контакт находится в самом устройстве / SIM-карте, а не в других учетных записях).

Я также не могу найти способ получить список учетных записей для сохранения (устройство, sim, google, ...)

Что я нашел

Я запустил этот код на устройстве Samsung, на котором есть контакты на SIM-карте, в хранилище и в учетных записях Google:

        final Map<String, String> result = new HashMap<>();
        final Cursor cursor = getContentResolver()
                .query(ContactsContract.RawContacts.CONTENT_URI, new String[]{RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME},
                        null, null,
                        null);
        final int accountNameIdx = cursor.getColumnIndex(RawContacts.ACCOUNT_NAME);
        final int accountTypeIdx = cursor.getColumnIndex(RawContacts.ACCOUNT_TYPE);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            result.put(cursor.getString(accountTypeIdx), cursor.getString(accountNameIdx));
        }
        cursor.close();
        Log.d("AppLog", "accounts found:");
        for (Entry<String, String> account : result.entrySet())
            Log.d("AppLog", account.getKey() + ":" + account.getValue());

И вот результат:

vnd.sec.contact.sim:primary.sim.account_name
com.google:[email protected]
vnd.sec.contact.phone:vnd.sec.contact.phone

Но, как я обнаружил (здесь), учетные записи sim / устройства могут отличаться на различных устройствах.

Вопросы

  1. Как правильно изменить существующий контакт, чтобы его ACCOUNT_TYPE принадлежал Google?

  2. Получает ли использование первого элемента следующего кода основную учетную запись пользователя Google, так что мне следует подумать об ее использовании:

    AccountManager.get(context).getAccountsByType("com.google")
    

    ?

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

  4. Есть ли способ получить все доступные учетные записи, которые могут быть установлены для контакта (включая sim / local), чтобы я мог представить пользователю диалоговое окно для выбора, в какой учетной записи сохранить контакт? Будет "getAccounts "достаточно, или мне как-то отфильтровать результаты?

РЕДАКТИРОВАТЬ: для # 4 кажется, что "getAccounts" не предоставляет мне sim и local в качестве возможных учетных записей для сохранения. Тем не менее, я хочу знать, как их получить, чтобы предложить пользователю выбрать их.


person android developer    schedule 02.05.2016    source источник


Ответы (1)


Здесь так много вопросов. Я мог бы ответить на несколько вопросов. Давайте посмотрим

1) Вы не можете изменить Account_Type существующего пользователя. Это объясняется здесь. Здесь четко указано, что Тип учетной записи может только можно изменить один раз. это, скорее всего, будет использоваться, чтобы вы могли добавить тип учетной записи в каждую строку для контакта.

2) Предоставленный вами код вернет вам список всех учетных записей типа com.google. Итак, если пользователь вошел в свой телефон с 3-мя учетными записями Google, вы получите список из трех учетных записей Google. Теперь идеальный пользовательский интерфейс в этом случае - показать пользователю список всех этих учетных записей, чтобы он мог выбрать их, и вы выполните свои операции после выбор пользователя для этой конкретной учетной записи. Дополнительный код можно найти здесь

3) Чтобы проверить, включена ли синхронизация, используйте флаг SHOULD_SYNC из ContactContracts .Settings. Вместо того, чтобы отправлять намерение, я полагаю, вы просто установите это значение, и источник данных будет реализовывать соответствующие наблюдатели контента, которые сделают эту работу за вас.

4) Я не уверен, что AccountManager вообще хранит данные о контактах на SIM-карте. По крайней мере, в документации об этом не упоминается. вы можете отлаживать с помощью корневого устройства и извлекать его базу данных sqlite, но если вы хотите получить только детали, я думаю, что это stackoverflow question имеет определенные подходы, которые стоит попробовать, и похоже, что они могут сработать на первый взгляд

Надеюсь, это ответит на ваши вопросы.

person ichthyocentaurs    schedule 10.05.2016
comment
1. Я имел в виду изменить его для контакта, который находится в адресной книге. как мне это сделать (в коде) и как узнать, что это все еще можно изменить? Кроме того, я не вижу в ссылке объяснения того, что вы написали. 2. Всегда ли будет первая в списке учетная запись основного пользователя? 3. Подскажите пожалуйста, как (код)? 4. Итак, как приложения для контактов могут отображать список, где хранить контакты (включая sim-карту)? - person android developer; 15.05.2016
comment
Примерно 4, он не может получить учетные записи SIM и локальные, но все же мне нужно получить список учетных записей, в которые я могу сохранять, включая SIM и локальные. предоставленная вами ссылка предназначена для запроса существующих контактов, поэтому она не будет работать, если их там еще нет. - person android developer; 15.05.2016