Управление местами хранения контактов

Приложения могут позволять пользователям создавать и хранить контакты. Эти контакты обычно можно сохранять в двух местах:

  1. Облачная учетная запись : сохраняйте контакты в учетной записи, связанной с облачным сервисом (например, Google Cloud), чтобы обеспечить синхронизацию и резервное копирование контактов.
  2. Локальная учетная запись : контакты можно хранить локально на устройстве.

Пользователи могут задать предпочитаемое место хранения в настройках устройства. Это предпочитаемое место называется учетной записью по умолчанию и используется при создании контактов. Приложения должны учитывать это предпочтение. В этом документе объясняется, как работать с различными местами хранения контактов, включая облачные учетные записи и локальные учетные записи, а также внедрять передовые методы управления пользовательскими настройками. Локальная учетная запись относится к хранению контактов непосредственно на устройстве.

Восстановить учетную запись по умолчанию

Чтобы определить учетную запись по умолчанию для новых контактов, используйте ContactsContract.RawContacts.DefaultAccount

Вызовите getDefaultAccountForNewContacts() , чтобы получить объект ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState . Этот объект содержит информацию о настройке учетной записи по умолчанию.

Котлин

import ContactsContrast.RawContacts
import ContactsContrast.RawContacts.DefaultAccount
import ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState

val defaultAccountAndState: DefaultAccountAndState =
  DefaultAccount.getDefaultAccountForNewContacts(
      getContentResolver()
  )

Ява

import ContactsContrast.RawContacts;
import ContactsContrast.RawContacts.DefaultAccount;
import ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState;

DefaultAccountAndState defaultAccountAndState =
  DefaultAccount.getDefaultAccountForNewContacts(
    getContentResolver()
  );

Объект DefaultAccountAndState содержит:

  • Состояние: указывает, установлена ​​ли учетная запись по умолчанию, и если да, то категорию этой учетной записи (облачная, локальная или SIM-карта).
  • Счет: Предоставляет конкретные данные счета (имя и тип), если состояние DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM . Для других состояний, включая DEFAULT_ACCOUNT_STATE_LOCAL , он будет нулевым.

Вот пример анализа объекта DefaultAccountAndState :

Котлин

// Retrieves the state of default account.
val defaultAccountState = defaultAccountAndState.state
var defaultAccountName: String? = null
var defaultAccountType: String? = null

when (defaultAccountState) {
    // Default account is set to a cloud or a SIM account.
    DefaultAccountState.DEFAULT_ACCOUNT_STATE_CLOUD,
    DefaultAccountState.DEFAULT_ACCOUNT_STATE_SIM -> {
        defaultAccountName = defaultAccountAndState.account?.name
        defaultAccountType = defaultAccountAndState.account?.type
    }
    // Default account is set to the local account on the device.
    DefaultAccountState.DEFAULT_ACCOUNT_STATE_LOCAL -> {
        defaultAccountName = RawContacts.getLocalAccountType()
        defaultAccountType = RawContacts.getLocalAccountName()
    }
    // Default account is not set.
    DefaultAccountState.DEFAULT_ACCOUNT_STATE_NOT_SET -> {
    }
}

Ява

// Retrieves the state of default account.
var defaultAccountState = defaultAccountAndState.getState();
String defaultAccountName = null;
String defaultAccountType = null;

switch (defaultAccountState) {
  // Default account is set to a cloud or a SIM account.
  case DefaultAccountState.DEFAULT_ACCOUNT_STATE_CLOUD:
  case DefaultAccountState.DEFAULT_ACCOUNT_STATE_SIM:
    defaultAccountName = defaultAccountAndState.getAccount().name;
    defaultAccountType = defaultAccountAndState.getAccount().type;
    break;
  // Default account is set to the local account on the device.
  case  DefaultAccountState.DEFAULT_ACCOUNT_STATE_LOCAL:
    defaultAccountName = RawContacts.getLocalAccountType();
    defaultAccountType = RawContacts.getLocalAccountName();
    break;

  // Default account is not set.
  case DefaultAccountState.DEFAULT_ACCOUNT_STATE_NOT_SET:
    break;
}

Создавайте контакты без указания аккаунта

Если задана учетная запись по умолчанию, вашему приложению обычно не нужно явно указывать учетную запись при создании контактов. Система автоматически сохраняет новый контакт в учетной записи по умолчанию. Вот как создать контакт без указания учетной записи.

Создайте новый ArrayList объектов ContentProviderOperation . Этот список содержит операции для вставки необработанного контакта и связанных с ним данных.

Котлин

val ops = ArrayList<ContentProviderOperation>()

Ява

ArrayList<ContentProviderOperation> ops =
        new ArrayList<ContentProviderOperation>();

Создайте новый ContentProviderOperation для вставки необработанного контакта. Поскольку вы не указываете учетную запись, вам не нужно включать ACCOUNT_TYPE и ACCOUNT_NAME .

Котлин

val op = ContentProviderOperation.newInsert(
    ContactsContract.RawContacts.CONTENT_URI
)
ops.add(op.build())

Ява

ContentProviderOperation.Builder op =
    ContentProviderOperation.newInsert(
        ContactsContract.RawContacts.CONTENT_URI
    );
ops.add(op.build());

Добавьте другие объекты ContentProviderOperation в список операций, чтобы включить поля контакта (например, имя, номер телефона, адрес электронной почты). Затем выполните пакетную операцию для создания контакта.

Котлин

try {
    getContentResolver().applyBatch(
        ContactsContract.AUTHORITY, ops
    )
} catch (e: Exception) {
    // Handle exceptions
}

Ява

try {
    getContentResolver().applyBatch(
        ContactsContract.AUTHORITY, ops
    );
} catch (Exception e) {
    // Handle exceptions
}

Создайте контакты в облачном аккаунте

Чтобы создать контакт в облачной учетной записи, вставьте строку необработанного контакта в таблицу ContactsContract.RawContacts и укажите облачную учетную запись. Вот как:

Создайте новый ArrayList объектов ContentProviderOperation .

Котлин

val ops = ArrayList<ContentProviderOperation>()

Ява

ArrayList<ContentProviderOperation> ops =
    new ArrayList<ContentProviderOperation>();

Создайте новый ContentProviderOperation для вставки необработанного контакта. Используйте метод withValue() для указания типа учетной записи и имени учетной записи выбранного облачного аккаунта.

Котлин

val op = ContentProviderOperation.newInsert(
    ContactsContract.RawContacts.CONTENT_URI
)
    .withValue(
        ContactsContract.RawContacts.ACCOUNT_TYPE,
        selectedAccount.type
    )
    .withValue(
        ContactsContract.RawContacts.ACCOUNT_NAME,
        selectedAccount.name
    )
ops.add(op.build())

Ява

ContentProviderOperation.Builder op =
    ContentProviderOperation.newInsert(
        ContactsContract.RawContacts.CONTENT_URI
    )
        .withValue(
            ContactsContract.RawContacts.ACCOUNT_TYPE,
            selectedAccount.getType()
        )
        .withValue(
            ContactsContract.RawContacts.ACCOUNT_NAME,
            selectedAccount.getName()
        );
ops.add(op.build());

Добавьте другие объекты ContentProviderOperation в список операций, чтобы включить поля контакта и выполнить пакетную операцию по созданию контакта.

Создать контакты в локальной учетной записи

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

Создайте новый ArrayList объектов ContentProviderOperation .

Котлин

val ops = ArrayList<ContentProviderOperation>()

Ява

ArrayList<ContentProviderOperation> ops =
    new ArrayList<ContentProviderOperation>();

Создайте новый ContentProviderOperation для вставки необработанного контакта. Используйте ContactsContract.RawContacts.getLocalAccountName() и ContactsContract.RawContacts.getLocalAccountType() для указания информации об учетной записи для локальной учетной записи.

Котлин

val op = ContentProviderOperation.newInsert(
    ContactsContract.RawContacts.CONTENT_URI
)
    .withValue(
        ContactsContract.RawContacts.ACCOUNT_TYPE,
        ContactsContract.RawContacts.getLocalAccountType()
    )
    .withValue(
        ContactsContract.RawContacts.ACCOUNT_NAME,
        ContactsContract.RawContacts.getLocalAccountName()
    )
ops.add(op.build())

Ява

ContentProviderOperation.Builder op =
    ContentProviderOperation.newInsert(
        ContactsContract.RawContacts.CONTENT_URI
    )
        .withValue(
            ContactsContract.RawContacts.ACCOUNT_TYPE,
            ContactsContract.RawContacts.getLocalAccountType()
        )
        .withValue(
            ContactsContract.RawContacts.ACCOUNT_NAME,
            ContactsContract.RawContacts.getLocalAccountName()
        );
ops.add(op.build());

Добавьте другие объекты ContentProviderOperation в список операций, чтобы включить поля контакта, и выполните пакетные операции для создания контакта.