Zarządzanie lokalizacjami przechowywania kontaktów

Aplikacje mogą umożliwiać użytkownikom tworzenie i przechowywanie kontaktów. Te kontakty można zwykle zapisać w 2 miejscach:

  1. 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.
  2. 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 tym DEFAULT_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.