Zarządzanie lokalizacjami przechowywania kontaktów

Aplikacje mogą zezwalać użytkownikom na tworzenie i przechowywanie kontaktów. Te kontakty 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ć 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 toDEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. W przypadku innych stanów, w tym DEFAULT_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()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.