Gestire le posizioni di archiviazione dei contatti

Le app possono consentire agli utenti di creare e memorizzare contatti. In genere, questi contatti possono 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 archiviati localmente sul dispositivo.

Gli utenti possono impostare la posizione di archiviazione preferita nelle impostazioni del dispositivo. Questa località preferita è nota come account predefinito e viene utilizzata per creare i contatti. Le app devono rispettare questa preferenza. Questo documento spiega come gestire diversi luoghi di archiviazione dei contatti, inclusi gli account cloud e gli account locali, e come implementare le best practice per la gestione delle preferenze degli utenti. L'account locale si riferisce alla memorizzazione 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 questo caso, la relativa categoria (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 la tua 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 di operazioni per includere i campi di contatto (ad esempio nome, numero di telefono, email). Quindi, esegui l'operazione di gruppo 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 tabellaContactsContract.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 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 di operazioni per includere i campi del contatto ed esegui l'operazione collettiva 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 tabellaContactsContract.RawContacts e specifica i dati 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 le informazioni dell'account per l'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 di operazioni per includere i campi del contatto ed esegui le operazioni collettive per creare il contatto.