Приложения могут позволять пользователям создавать и хранить контакты. Обычно эти контакты можно сохранять в двух местах:
- Учетная запись в облаке : сохраняйте контакты в учетной записи, связанной с облачным сервисом (например, Google Cloud), чтобы обеспечить синхронизацию и резервное копирование контактов.
- Локальная учетная запись : контакты можно хранить локально на устройстве.
Пользователи могут указать предпочитаемое место хранения в настройках устройства. Это предпочитаемое место называется учётной записью по умолчанию и используется при создании контактов. Приложения должны учитывать эти настройки. В этом документе объясняется, как работать с различными местами хранения контактов, включая облачные и локальные учётные записи, а также как применять рекомендации по управлению пользовательскими настройками. Локальная учётная запись подразумевает хранение контактов непосредственно на устройстве.
Восстановить учетную запись по умолчанию
Чтобы определить учетную запись по умолчанию для новых контактов, используйте 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
, значение будет равно null .
Вот пример анализа объекта 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
в список операций, чтобы включить поля контактов, и выполните пакетные операции для создания контакта.