Приложения могут позволять пользователям создавать и хранить контакты. Эти контакты обычно можно сохранить в двух местах:
- Облачная учетная запись : Сохраняйте контакты в учетной записи, связанной с облачным сервисом (например, 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()
)
Java
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 -> {
}
}
Java
// 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>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Создайте новый ContentProviderOperation для вставки исходного контакта. Поскольку вы не указываете учетную запись, вам не нужно включать ACCOUNT_TYPE и ACCOUNT_NAME .
Котлин
val op = ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
)
ops.add(op.build())
Java
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
}
Java
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
);
} catch (Exception e) {
// Handle exceptions
}
Создавайте контакты в облачном аккаунте.
Чтобы создать контакт в облачной учетной записи, вставьте строку с исходным контактом в таблицу ContactsContract.RawContacts и укажите облачную учетную запись. Вот как это сделать:
Создайте новый ArrayList объектов ContentProviderOperation .
Котлин
val ops = ArrayList<ContentProviderOperation>()
Java
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())
Java
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>()
Java
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())
Java
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 , чтобы включить поля контакта, и выполните пакетные операции для создания контакта.