Aplikacje mogą umożliwiać użytkownikom tworzenie i przechowywanie kontaktów. Kontakty te można zwykle zapisać w 2 miejscach:
- Konto w chmurze: zapisz kontakty na koncie powiązanym z usługą w chmurze (np. Google Cloud), aby umożliwić synchronizację i tworzenie kopii zapasowych kontaktów.
- 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 korzystać z różnych lokalizacji przechowywania kontaktów, w tym kont w chmurze i kont lokalnych, oraz jak wdrażać sprawdzone metody zarządzania preferencjami użytkowników. Konto lokalne oznacza przechowywanie kontaktów bezpośrednio na urządzeniu.
Pobieranie konta domyślnego
Aby określić domyślne konto dla nowych kontaktów, użyj
ContactsContract.RawContacts.DefaultAccount
Zadzwoń pod numer getDefaultAccountForNewContacts()
, aby uzyskać obiekt
ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
. Ten obiekt zawiera informacje o domyślnych ustawieniach konta.
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 określania konta
Jeśli konto domyślne jest ustawione, aplikacja zwykle nie musi wyraźnie określać konta podczas tworzenia kontaktów. System automatycznie zapisuje nowy kontakt na koncie domyślnym. Oto jak utworzyć kontakt bez określania konta.
Utwórz nowy ArrayList
z ContentProviderOperation
obiektów. Ta lista zawiera operacje wstawiania surowego kontaktu i powiązanych z nim danych.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Utwórz nowy ContentProviderOperation
, aby wstawić surowy kontakt. Ponieważ nie określasz konta, nie musisz dodawać atrybutów 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 do listy operacji inne obiekty ContentProviderOperation
, aby uwzględnić pola kontaktu (np. imię i nazwisko, numer telefonu, adres e-mail). Następnie wykonaj operację wsadową, 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 z nieprzetworzonym kontaktem do tabeli ContactsContract.RawContacts
i określ konto w chmurze. Aby to zrobić:
Utwórz nowy ArrayList
z ContentProviderOperation
obiektów.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Utwórz nowy ContentProviderOperation
, aby wstawić surowy kontakt. Użyj metody withValue()
, aby określić typ 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 do listy operacji inne obiekty ContentProviderOperation
, aby uwzględnić pola kontaktu i wykonać operację zbiorczą w celu utworzenia kontaktu.
Tworzenie kontaktów na koncie lokalnym
Aby utworzyć kontakt na koncie lokalnym, wstaw nowy wiersz z surowym kontaktem do tabeli
ContactsContract.RawContacts
i określ informacje o koncie lokalnym:
Utwórz nowy ArrayList
z ContentProviderOperation
obiektów.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Utwórz nowy ContentProviderOperation
, aby wstawić surowy kontakt. Użyj znaków
ContactsContract.RawContacts.getLocalAccountName()
i
ContactsContract.RawContacts.getLocalAccountType()
, aby podać 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 do listy operacji inne obiekty ContentProviderOperation
, aby uwzględnić pola kontaktu, i wykonaj operacje wsadowe, aby utworzyć kontakt.