Gestire le posizioni di archiviazione dei contatti

Le app possono consentire agli utenti di creare e archiviare contatti. Questi contatti possono in genere essere salvati in due posizioni:

  1. Account cloud: salva i contatti in un account associato a un servizio cloud (ad esempio Google Cloud) per consentire la sincronizzazione e il backup dei contatti.
  2. Account locale: i contatti possono essere memorizzati localmente sul dispositivo.

Gli utenti possono impostare la posizione di archiviazione preferita nelle impostazioni del dispositivo. Questa posizione preferita è nota come account predefinito e viene utilizzata durante la creazione dei contatti. Le app devono rispettare questa preferenza. Questo documento spiega come utilizzare diverse posizioni di archiviazione dei contatti, inclusi gli account cloud e gli account locali, e implementare le best practice per la gestione delle preferenze degli utenti. L'account locale si riferisce all'archiviazione dei contatti direttamente sul dispositivo.

Recuperare l'account predefinito

Per determinare l'account predefinito per i nuovi contatti, utilizza ContactsContract.RawContacts.DefaultAccount

Chiama getDefaultAccountForNewContacts() per ottenere l'oggetto ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState. Questo oggetto contiene informazioni sull'impostazione predefinita dell'account.

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()
  );

L'oggetto DefaultAccountAndState contiene:

  • Stato: indica se è impostato un account predefinito e, in caso affermativo, la categoria di questo account (cloud, locale o SIM).
  • Account: fornisce i dettagli specifici dell'account (nome e tipo) se lo stato è DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. Sarà nullo per gli altri stati, incluso DEFAULT_ACCOUNT_STATE_LOCAL.

Ecco un esempio di come analizzare l'oggetto 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;
}

Creare contatti senza specificare un account

Se l'account predefinito è impostato, in genere l'app non deve specificare esplicitamente un account durante la creazione dei contatti. Il sistema salva automaticamente il nuovo contatto nell'account predefinito. Ecco come creare un contatto senza specificare un account.

Crea un nuovo ArrayList di oggetti ContentProviderOperation. Questo elenco contiene le operazioni per inserire il contatto non elaborato e i relativi dati associati.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

ArrayList<ContentProviderOperation> ops =
        new ArrayList<ContentProviderOperation>();

Crea un nuovo ContentProviderOperation per inserire il contatto non elaborato. Poiché non specifichi un account, non è necessario includere ACCOUNT_TYPE e 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());

Aggiungi altri oggetti ContentProviderOperation all'elenco delle operazioni per includere i campi di contatto (come nome, numero di telefono, email). Quindi esegui l'operazione batch per creare il contatto.

Kotlin

try {
    getContentResolver().applyBatch(
        ContactsContract.AUTHORITY, ops
    )
} catch (e: Exception) {
    // Handle exceptions
}

Java

try {
    getContentResolver().applyBatch(
        ContactsContract.AUTHORITY, ops
    );
} catch (Exception e) {
    // Handle exceptions
}

Creare contatti in un account cloud

Per creare un contatto in un account cloud, inserisci la riga del contatto non elaborato nella tabella ContactsContract.RawContacts e specifica l'account cloud. Ecco come:

Crea un nuovo ArrayList di oggetti ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

ArrayList<ContentProviderOperation> ops =
    new ArrayList<ContentProviderOperation>();

Crea un nuovo ContentProviderOperation per inserire il contatto non elaborato. Utilizza il metodo withValue() per specificare il tipo di account e il nome dell'account cloud selezionato.

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());

Aggiungi altri oggetti ContentProviderOperation all'elenco delle operazioni per includere i campi di contatto ed esegui l'operazione batch per creare il contatto.

Creare contatti nell'account locale

Per creare un contatto nell'account locale, inserisci una nuova riga di contatto non elaborato nella tabella ContactsContract.RawContacts e specifica le informazioni dell'account locale:

Crea un nuovo ArrayList di oggetti ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

ArrayList<ContentProviderOperation> ops =
    new ArrayList<ContentProviderOperation>();

Crea un nuovo ContentProviderOperation per inserire il contatto non elaborato. Utilizza ContactsContract.RawContacts.getLocalAccountName() e ContactsContract.RawContacts.getLocalAccountType() per specificare i dati dell'account locale.

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());

Aggiungi altri oggetti ContentProviderOperation all'elenco delle operazioni per includere i campi di contatto ed esegui le operazioni batch per creare il contatto.