Gérer les emplacements de stockage des contacts

Les applications peuvent autoriser les utilisateurs à créer et à stocker des contacts. Ces contacts peuvent généralement être enregistrés à deux endroits :

  1. Compte cloud : enregistrez vos contacts dans un compte associé à un service cloud (tel que Google Cloud) pour permettre la synchronisation et la sauvegarde des contacts.
  2. Compte local : les contacts peuvent être stockés localement sur l'appareil.

Les utilisateurs peuvent définir leur emplacement de stockage préféré dans les paramètres de l'appareil. Cet emplacement préféré est appelé compte par défaut et est utilisé lors de la création de contacts. Les applications doivent respecter cette préférence. Ce document explique comment utiliser différents emplacements de stockage des contacts, y compris les comptes cloud et les comptes locaux, et comment mettre en œuvre les bonnes pratiques pour gérer les préférences des utilisateurs. Le compte local fait référence au stockage des contacts directement sur l'appareil.

Récupérer le compte par défaut

Pour déterminer le compte par défaut pour les nouveaux contacts, utilisez ContactsContract.RawContacts.DefaultAccount.

Appelez getDefaultAccountForNewContacts() pour obtenir l'objet ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState. Cet objet contient des informations sur le paramètre de compte par défaut.

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'objet DefaultAccountAndState contient les éléments suivants :

  • État : indique si un compte par défaut est défini et, le cas échéant, la catégorie de ce compte (cloud, local ou SIM).
  • Compte : fournit les détails spécifiques du compte (nom et type) si l'état est DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. Elle sera nulle pour les autres états, y compris DEFAULT_ACCOUNT_STATE_LOCAL.

Voici un exemple d'analyse de l'objet 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;
}

Créer des contacts sans spécifier de compte

Si le compte par défaut est défini, votre application n'a généralement pas besoin de spécifier explicitement un compte lors de la création de contacts. Le système enregistre automatiquement le nouveau contact dans le compte par défaut. Voici comment créer un contact sans spécifier de compte.

Créez un ArrayList d'objets ContentProviderOperation. Cette liste contient les opérations permettant d'insérer le contact brut et les données associées.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Créez un ContentProviderOperation pour insérer le contact brut. Étant donné que vous ne spécifiez pas de compte, vous n'avez pas besoin d'inclure ACCOUNT_TYPE et 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());

Ajoutez d'autres objets ContentProviderOperation à la liste des opérations pour inclure les champs de contact (comme le nom, le numéro de téléphone et l'adresse e-mail). Exécutez ensuite l'opération par lot pour créer le contact.

Kotlin

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

Java

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

Créer des contacts dans un compte cloud

Pour créer un contact dans un compte cloud, insérez la ligne de contact brute dans la table ContactsContract.RawContacts et spécifiez le compte cloud. Voici comment procéder :

Créez un ArrayList d'objets ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Créez un ContentProviderOperation pour insérer le contact brut. Utilisez la méthode withValue() pour spécifier le type et le nom du compte cloud sélectionné.

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

Ajoutez d'autres objets ContentProviderOperation à la liste des opérations pour inclure les champs de contact et exécuter l'opération par lot afin de créer le contact.

Créer des contacts dans le compte local

Pour créer un contact dans le compte local, insérez une ligne de contact brut dans la table ContactsContract.RawContacts et spécifiez les informations du compte local :

Créez un ArrayList d'objets ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Créez un ContentProviderOperation pour insérer le contact brut. Utilisez ContactsContract.RawContacts.getLocalAccountName() et ContactsContract.RawContacts.getLocalAccountType() pour spécifier les informations de compte pour le compte local.

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

Ajoutez d'autres objets ContentProviderOperation à la liste des opérations pour inclure les champs de contact, puis exécutez les opérations par lot pour créer le contact.