Speicherorte für Kontakte verwalten

Apps können Nutzern das Erstellen und Speichern von Kontakten ermöglichen. Diese Kontakte können in der Regel an zwei Stellen gespeichert werden:

  1. Cloud-Konto: Kontakte in einem Konto speichern, das mit einem Cloud-Dienst wie Google Cloud verknüpft ist, um die Synchronisierung und Sicherung von Kontakten zu ermöglichen.
  2. Lokales Konto: Kontakte können lokal auf dem Gerät gespeichert werden.

Nutzer können ihren bevorzugten Speicherort in den Geräteeinstellungen festlegen. Dieser bevorzugte Speicherort wird als Standardkonto bezeichnet und wird beim Erstellen von Kontakten verwendet. Apps müssen diese Einstellung berücksichtigen. In diesem Dokument wird beschrieben, wie Sie mit verschiedenen Speicherorten für Kontakte arbeiten, einschließlich Cloud-Konten und lokalen Konten, und Best Practices für die Verwaltung von Nutzereinstellungen implementieren. Das lokale Konto bezieht sich auf das Speichern von Kontakten direkt auf dem Gerät.

Standardkonto abrufen

Verwenden Sie das Symbol ContactsContract.RawContacts.DefaultAccount, um das Standardkonto für neue Kontakte festzulegen.

Rufen Sie getDefaultAccountForNewContacts() auf, um das ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState-Objekt abzurufen. Dieses Objekt enthält Informationen zur Standardkontoeinstellung.

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

Das DefaultAccountAndState-Objekt enthält:

  • Status: Gibt an, ob ein Standardkonto festgelegt ist und, falls ja, die Kategorie dieses Kontos (Cloud, lokal oder SIM).
  • Konto: Enthält die Kontodetails (Name und Typ), wenn der Status DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM ist. Für andere Bundesstaaten, einschließlich DEFAULT_ACCOUNT_STATE_LOCAL, ist der Wert „null“.

Hier ein Beispiel für das Parsen des DefaultAccountAndState-Objekts:

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;
}

Kontakte ohne Angabe eines Kontos erstellen

Wenn das Standardkonto festgelegt ist, muss in Ihrer App beim Erstellen von Kontakten normalerweise kein Konto explizit angegeben werden. Der neue Kontakt wird automatisch im Standardkonto gespeichert. So erstellen Sie einen Kontakt, ohne ein Konto anzugeben:

Erstellen Sie eine neue ArrayList von ContentProviderOperation-Objekten. Diese Liste enthält die Vorgänge zum Einfügen des Rohkontakts und der zugehörigen Daten.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Erstellen Sie eine neue ContentProviderOperation, um den Rohkontakt einzufügen. Da du kein Konto angibst, musst du ACCOUNT_TYPE und ACCOUNT_NAME nicht angeben.

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

Fügen Sie der Liste „ops“ weitere ContentProviderOperation-Objekte hinzu, um die Kontaktfelder (z. B. Name, Telefonnummer, E-Mail-Adresse) aufzunehmen. Führen Sie dann den Batchvorgang aus, um den Kontakt zu erstellen.

Kotlin

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

Java

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

Kontakte in einem Cloud-Konto erstellen

Wenn Sie einen Kontakt in einem Cloud-Konto erstellen möchten, fügen Sie die Zeile mit den Kontaktdaten in die Tabelle ContactsContract.RawContacts ein und geben Sie das Cloud-Konto an. So gehts:

Erstellen Sie eine neue ArrayList von ContentProviderOperation-Objekten.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Erstellen Sie eine neue ContentProviderOperation, um den Rohkontakt einzufügen. Verwenden Sie die Methode withValue(), um den Kontotyp und den Kontonamen des ausgewählten Cloud-Kontos anzugeben.

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

Fügen Sie der Liste der Vorgänge weitere ContentProviderOperation-Objekte hinzu, um die Kontaktfelder einzubeziehen, und führen Sie den Batchvorgang aus, um den Kontakt zu erstellen.

Kontakte im lokalen Konto erstellen

Wenn Sie einen Kontakt im lokalen Konto erstellen möchten, fügen Sie eine neue Zeile für den Rohkontakt in die Tabelle ContactsContract.RawContacts ein und geben Sie die Kontoinformationen für das lokale Konto an:

Erstellen Sie eine neue ArrayList von ContentProviderOperation-Objekten.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Erstellen Sie eine neue ContentProviderOperation, um den Rohkontakt einzufügen. Verwenden Sie ContactsContract.RawContacts.getLocalAccountName() und ContactsContract.RawContacts.getLocalAccountType(), um die Kontoinformationen für das lokale Konto anzugeben.

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

Fügen Sie der Liste der Vorgänge weitere ContentProviderOperation-Objekte hinzu, um die Kontaktfelder einzubeziehen, und führen Sie die Batch-Vorgänge aus, um den Kontakt zu erstellen.