Aplikacje mogą zezwalać użytkownikom na tworzenie i przechowywanie kontaktów. Te kontakty 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ć preferowane miejsce 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ć te ustawienia. Ten dokument wyjaśnia, jak pracować z różnymi lokalizacjami kontaktów, w tym z kontami w chmurze i kontami lokalnymi, oraz jak stosować 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 ContactsContract.RawContacts.DefaultAccount
Aby uzyskać dostęp do obiektu ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
, zadzwoń pod numer getDefaultAccountForNewContacts()
. Ten obiekt zawiera informacje o domyślnym ustawieniu 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 ustawiono konto domyślne, a jeśli tak, do jakiej kategorii należy to konto (chmura, lokalnie czy karta SIM).
- Konto: zawiera 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 ona pusta.
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 ustawione jest konto domyślne, aplikacja zazwyczaj nie musi wyraźnie wskazywać konta podczas tworzenia kontaktów. System automatycznie zapisuje nowy kontakt na koncie domyślnym. Oto jak utworzyć kontakt bez podawania konta.
Utwórz nową ArrayList
obiektów ContentProviderOperation
. Ta lista zawiera operacje wstawiania nieprzetworzonego kontaktu i powiązanych z nim danych.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Aby wstawić surowy kontakt, utwórz nowy ContentProviderOperation
. Ponieważ nie określasz konta, nie musisz uwzględniać 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 inne obiekty ContentProviderOperation
do listy operacji, aby uwzględnić pola kontaktów (np. 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 z danymi kontaktowymi do tabeli ContactsContract.RawContacts
i wskaż konto w chmurze. Aby to zrobić:
Utwórz nową ArrayList
obiektów ContentProviderOperation
.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Aby wstawić surowy kontakt, utwórz nowy ContentProviderOperation
. Aby określić typ i nazwę wybranego konta w chmurze, użyj metody withValue()
.
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 kontaktów, i wykonaj operację zbiorczą, aby utworzyć kontakt.
Tworzenie kontaktów na koncie lokalnym
Aby utworzyć kontakt na koncie lokalnym, wstaw do tabeli ContactsContract.RawContacts
nowy wiersz z danymi kontaktu i wskaż informacje o koncie lokalnym:
Utwórz nową ArrayList
obiektów ContentProviderOperation
.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Aby wstawić surowy kontakt, utwórz nowy ContentProviderOperation
. Aby podać informacje o koncie lokalnym, użyj parametrów ContactsContract.RawContacts.getLocalAccountName()
i ContactsContract.RawContacts.getLocalAccountType()
.
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 kontaktów, i wykonaj operacje zbiorcze, aby utworzyć kontakt.