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

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

  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 в список операций, чтобы включить поля контактов, и выполните пакетные операции для создания контакта.