Apps können Nutzern erlauben, Kontakte zu erstellen und zu speichern. Diese Kontakte können normalerweise an zwei Orten gespeichert werden:
- Cloud-Konto: Kontakte werden in einem Konto gespeichert, das mit einem Cloud-Dienst (z. B. Google Cloud) verknüpft ist, um die Synchronisierung und Sicherung von Kontakten zu ermöglichen.
- 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 beim Erstellen von Kontakten verwendet. Apps sollten diese Einstellung berücksichtigen. In diesem Dokument wird erläutert, wie Sie mit verschiedenen Speicherorten für Kontakte arbeiten, einschließlich Cloud-Konten und lokalen Konten, und wie Sie 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
Mit ContactsContract.RawContacts.DefaultAccount können Sie das Standardkonto für neue Kontakte festlegen.
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 wenn ja, die Kategorie dieses Kontos (Cloud, lokal oder SIM).
- Konto: Enthält die spezifischen Kontodetails (Name und Typ), wenn der Status
DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIMlautet. Für andere Status, einschließlichDEFAULT_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 erstellen, ohne ein Konto anzugeben
Wenn das Standardkonto festgelegt ist, muss Ihre App beim Erstellen von Kontakten normalerweise kein Konto explizit angeben. Das System speichert den neuen Kontakt automatisch im Standardkonto. So erstellen Sie einen Kontakt, ohne ein Konto anzugeben:
Erstellen Sie ein neues 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>();
Erstelle einen neuen ContentProviderOperation, um den Rohkontakt einzufügen. Da Sie kein Konto angeben, müssen Sie 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) einzuschließen. 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 du einen Kontakt in einem Cloud-Konto erstellen möchtest, füge die Rohkontaktzeile in die Tabelle ContactsContract.RawContacts ein und gib das Cloud-Konto an. So gehts:
Erstellen Sie ein neues ArrayList von ContentProviderOperation-Objekten.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Erstelle einen neuen 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 „ops“ weitere ContentProviderOperation-Objekte hinzu, um die Kontaktfelder einzuschließen, 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 Rohkontaktzeile in die Tabelle ContactsContract.RawContacts ein und geben Sie die Kontoinformationen für das lokale Konto an:
Erstellen Sie ein neues ArrayList von ContentProviderOperation-Objekten.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Erstelle einen neuen 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 „ops“ weitere ContentProviderOperation-Objekte hinzu, um die Kontaktfelder einzuschließen, und führen Sie die Batchvorgänge aus, um den Kontakt zu erstellen.