Zarządzanie lokalizacjami przechowywania kontaktów

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

  1. 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.
  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 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 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 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 ArrayListContentProviderOperation 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 ArrayListContentProviderOperation 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 ArrayListContentProviderOperation 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()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.