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