Aplikacje mogą umożliwiać użytkownikom tworzenie i przechowywanie kontaktów. Te kontakty można zwykle zapisać w 2 miejscach:
- Konto w chmurze: zapisuj kontakty na koncie powiązanym z usługą w chmurze (np. Google Cloud), aby umożliwić ich synchronizację i tworzenie kopii zapasowych.
- Konto lokalne: kontakty mogą być przechowywane lokalnie na urządzeniu.
Użytkownicy mogą ustawić preferowaną lokalizację przechowywania w ustawieniach urządzenia. Ta preferowana lokalizacja jest nazywana kontem domyślnym i jest używana podczas tworzenia kontaktów. Aplikacje powinny uwzględniać to ustawienie. W tym dokumencie wyjaśniamy, jak pracować z różnymi lokalizacjami przechowywania kontaktów, w tym z kontami w chmurze i kontami lokalnymi, oraz jak wdrażać sprawdzone metody zarządzania preferencjami użytkowników. Konto lokalne odnosi się do przechowywania kontaktów bezpośrednio na urządzeniu.
Pobieranie konta domyślnego
Aby określić domyślne konto dla nowych kontaktów, użyj właściwości ContactsContract.RawContacts.DefaultAccount.
Wywołaj getDefaultAccountForNewContacts(), aby uzyskać obiekt ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState. Ten obiekt zawiera informacje o ustawieniu konta domyślnego.
Kotlin
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()
);
Obiekt DefaultAccountAndState zawiera:
- Stan: wskazuje, czy ustawione jest konto domyślne, a jeśli tak, to jego kategorię (chmura, lokalne lub SIM).
- Konto: podaje szczegółowe informacje o koncie (nazwę i typ), jeśli stan to
DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. W przypadku innych stanów, w tymDEFAULT_ACCOUNT_STATE_LOCAL, będzie to wartość null.
Oto przykład analizowania obiektu DefaultAccountAndState:
Kotlin
// 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;
}
Tworzenie kontaktów bez podawania konta
Jeśli konto domyślne jest ustawione, aplikacja zwykle nie musi jawnie określać konta podczas tworzenia kontaktów. System automatycznie zapisze nowy kontakt na koncie domyślnym. Oto jak utworzyć kontakt bez podawania konta.
Utwórz nowy ArrayList z ContentProviderOperation obiektami. Ta lista zawiera operacje wstawiania kontaktu bazowego i powiązanych z nim danych.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Utwórz nowy obiekt ContentProviderOperation, aby wstawić kontakt bazowy. Ponieważ nie określasz konta, nie musisz podawać ACCOUNT_TYPE ani ACCOUNT_NAME.
Kotlin
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());
Dodaj inne obiekty ContentProviderOperation do listy operacji, aby uwzględnić pola kontaktu (takie jak imię i nazwisko, numer telefonu, adres e-mail). Następnie wykonaj operację zbiorczą, aby utworzyć kontakt.
Kotlin
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
)
} catch (e: Exception) {
// Handle exceptions
}
Java
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
);
} catch (Exception e) {
// Handle exceptions
}
Tworzenie kontaktów na koncie w chmurze
Aby utworzyć kontakt na koncie w chmurze, wstaw wiersz kontaktu bazowego do tabeli ContactsContract.RawContacts i określ konto w chmurze. Aby to zrobić:
Utwórz nowy ArrayList z ContentProviderOperation obiektami.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Utwórz nowy obiekt ContentProviderOperation, aby wstawić kontakt bazowy. Użyj metody withValue(), aby określić rodzaj konta i nazwę wybranego konta w chmurze.
Kotlin
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());
Dodaj inne obiekty ContentProviderOperation do listy operacji, aby uwzględnić pola kontaktu, i wykonaj operację zbiorczą, aby utworzyć kontakt.
Tworzenie kontaktów na koncie lokalnym
Aby utworzyć kontakt na koncie lokalnym, wstaw nowy wiersz kontaktu bazowego do tabeli ContactsContract.RawContacts i podaj informacje o koncie lokalnym:
Utwórz nowy ArrayList z ContentProviderOperation obiektami.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Utwórz nowy obiekt ContentProviderOperation, aby wstawić kontakt bazowy. Użyj ContactsContract.RawContacts.getLocalAccountName() i ContactsContract.RawContacts.getLocalAccountType(), aby określić informacje o koncie lokalnym.
Kotlin
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());
Dodaj inne obiekty ContentProviderOperation do listy operacji, aby uwzględnić pola kontaktu, i wykonaj operacje zbiorcze, aby utworzyć kontakt.