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 dans deux emplacements:

  1. Compte cloud: enregistrez les 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 l'emplacement de stockage de leur choix 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:

  • É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 informations spécifiques sur le compte (nom et type) si l'état est DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. Il sera nul 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 d'insertion du contact brut et des 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 (nom, numéro de téléphone, adresse e-mail, etc.). 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, puis exécutez l'opération par lot pour 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 brute dans la table ContactsContract.RawContacts et spécifiez les informations du compte pour le 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 du 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.