Produktneuigkeiten

Eine zuverlässigere Methode zum Hinzufügen und Bearbeiten von Kontakten auf Android-Geräten

Lesezeit: 6 Minuten
Profil von Roxanna Aliabadi Walker ansehen
Roxanna Aliabadi Walker Product Manager, Android

Was ändert sich?

Apps, die auf die kommende Android-Version ausgerichtet sind, können mit der Berechtigung WRITE_CONTACTS nicht mehr direkt in Kontakte schreiben. Stattdessen können Sie die Standard-Intents für Kontakte verwenden (ACTION_INSERT, ACTION_EDIT und ACTION_INSERT_OR_EDIT). Eine vollständige Referenzimplementierung finden Sie im Entwicklerleitfaden zum Ändern von Kontakten mithilfe von Intents. 

Auf Geräten mit der kommenden Android-Version verhalten sich diese drei Kontakt-Intents einheitlich und erfordern überhaupt keine Berechtigung. Wenn Ihre App auf die kommende Android-Version oder höher ausgerichtet ist und versucht, direkt in Kontakte zu schreiben, werden diese Schreibvorgänge abgelehnt und führen zu einem SecurityException oder einer Berechtigungsverweigerung. Für die wenigen Apps, die umfassenden Zugriff zum Erstellen und Ändern von Kontakten benötigen, wird in Android 17 QPR2 (4. Quartal 2026) eine neue spezielle App-Zugriffsberechtigung eingeführt: MANAGE_CONTACTS. Google Play veröffentlicht heute aktualisierte Richtlinien für den Zugriff auf Kontakte, einschließlich MANAGE_CONTACTS.

Warum wir das tun

Wenn Ihre App auch nur einen Kontakt speichern muss, fordern Sie derzeit möglicherweise WRITE_CONTACTS an. Diese Berechtigung gewährt jedoch weitreichenden Zugriff, sodass eine App im Hintergrund umfangreiche Änderungen an Kontakten auf dem Gerät vornehmen kann, auch ohne Nutzerinteraktion. Die meisten Apps benötigen keine so umfassende Berechtigung.

Es gibt zwar Alternativen, aber wir haben von Ihnen gehört, dass diese im gesamten Ökosystem stärker standardisiert werden müssen. Bisher verhielten sich die Kontakt-Intents von Gerät zu Gerät unterschiedlich. Einige Editoren haben die von Ihnen übergebenen Daten, z. B. ein Kontaktfoto, verworfen. Auf einigen Geräten wurde der Kontakt durch Tippen auf den Button „Zurück“ gespeichert, ohne dass der Nutzer dies beabsichtigt hatte, oder die Option „Neuen Kontakt erstellen“ war schwer zu finden. Daher war es die rationale Entscheidung, um Erlaubnis zu bitten. Wir beheben alle diese Probleme in der kommenden Android-Version und verlangen, dass Geräte, auf denen diese Version ausgeführt wird, dieselben Standards einhalten.

Was Sie stattdessen verwenden können

Kontakt hinzufügen oder bearbeiten: Kontakt-Intents verwenden

Wenn Sie die Intents ACTION_INSERT, ACTION_EDIT und ACTION_INSERT_OR_EDIT verwenden, übernimmt das System die meiste Arbeit und stellt einen übersichtlichen,  standardisierten Kontakteditor bereit. Es wird ein kurzes Formular für neue Einträge geöffnet, oder der Nutzer kann ganz einfach nach einem vorhandenen Kontakt suchen und Informationen hinzufügen. Nutzer können diese Ansicht nahtlos zu einem ganzseitigen Editor erweitern, um weitere Details einzugeben, ohne dass Ihre App jemals direkte Schreibberechtigungen benötigt. Hier sind die vorläufigen UX-Modelle: 

Figure01_01_Quick_Insert_Half_Sheet_Prefilled.png
Screenshot 2 – Titel: Full-Sheet Mock of Create a New Contact: Screenshot einer vorläufigen Android-Benutzeroberfläche mit einem Vollbild-Kontakteditor mit Avatar-Auswahl, Name, Telefonnummer und E‑Mail-Feldern. Das Design ist mit „UX not Final“ gekennzeichnet.

Abbildung 1: Neuen Kontakt erstellen  *UX nicht endgültig*

Figure02_01_Add_To_Existing_0_Search_State_Half_Sheet.png
Screenshot 2 – Titel: Full-Sheet Mock of „Add Info to an Existing Contact“: Screenshot einer vorläufigen Android-Benutzeroberfläche mit einem Vollbild-Kontakteditor mit Avatar-Auswahl, Name, Telefonnummer und E‑Mail-Feldern. Das ganzseitige Design enthält Chips für die schrittweise Offenlegung von sekundären Feldern. Das Design ist mit „UX nicht endgültig“ gekennzeichnet.

Abbildung 2: Informationen zu einem bestehenden Kontakt hinzufügen *UX nicht endgültig*


Hinweis:Die Benutzeroberfläche kann je nach Gerätehersteller und Betriebssystem variieren, das Verhalten bleibt jedoch gleich.


Sie können den Erstellungsprozess weiter optimieren, indem Sie neben dem Intent optionale Datennutzlasten, sogenannte Extras, übergeben:

  • EXTRA_ACCOUNT schlägt vor, in welchem Konto der Kontakt gespeichert werden soll. Das ist hilfreich, wenn Ihre App Kontakte synchronisiert. Diese Funktion gab es bereits, aber die Unterstützung variierte je nach Gerät. Ab der nächsten Android-Version wird die Unterstützung geräteübergreifend standardisiert.
  • EXTRA_PHOTO_URI übergibt ein Foto, um das Kontaktbild vorauszufüllen. Der Editor übernimmt die URI-Leseberechtigung für Sie. Diese Funktion ist neu im kommenden Android-Release und wird im gesamten Ökosystem unterstützt.

Vorher: Direktes Schreiben mit WRITE_CONTACTS (führt zu einer SecurityException oder einer Berechtigungsverweigerung, sobald deine App auf die kommende Android-Version ausgerichtet ist)

 

// Requires android.permission.WRITE_CONTACTS
fun saveContactDirectly(context: Context, name: String, phone: String, account: Account) {
    val ops = arrayListOf(
        ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, account.name)
            .build(),
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
            )
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .build(),
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
            )
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
            .build()
    )
    context.contentResolver.applyBatch(ContactsContract.AUTHORITY, ops)
}

 

 

Nachher: Öffnen des Kontakteditors (Keine Berechtigung erforderlich.)

 

fun saveContactWithEditor(
    context: Context,
    name: String,
    phone: String,
    account: Account,
    photoUri: Uri
) {
    val intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI).apply {
        putExtra(ContactsContract.Intents.Insert.NAME, name)
        putExtra(ContactsContract.Intents.Insert.PHONE, phone)
        // Suggest which account the contact is saved to
        putExtra(ContactsContract.Intents.Insert.EXTRA_ACCOUNT, account)
        // New in the upcoming Android release: pre-fill the contact photo
        putExtra(ContactsContract.Intents.Insert.EXTRA_PHOTO_URI, photoUri)
        clipData = ClipData.newRawUri("", photoUri)
        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }
    context.startActivity(intent)
}

 

Vorher: Vorhandenen Kontakt direkt aktualisieren

 

// Requires android.permission.WRITE_CONTACTS
fun addPhoneDirectly(context: Context, rawContactId: Long, phone: String) {
    val values = ContentValues().apply {
        put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
        put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
        put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
    }
    context.contentResolver.insert(ContactsContract.Data.CONTENT_URI, values)
}

Nachher: Nutzer können einen Kontakt auswählen, um ihn zu aktualisieren, oder einen neuen Kontakt erstellen

fun addPhoneWithEditor(context: Context, phone: String) {
    val intent = Intent(Intent.ACTION_INSERT_OR_EDIT).apply {
        type = ContactsContract.Contacts.CONTENT_ITEM_TYPE
        putExtra(ContactsContract.Intents.Insert.PHONE, phone)
    }
    context.startActivity(intent)
}

Wenn Sie bereits wissen, welchen Kontakt Sie aktualisieren möchten, verwenden Sie ACTION_EDIT mit dem URI dieses Kontakts:

fun editKnownContact(context: Context, contactUri: Uri, phone: String) {
    val intent = Intent(Intent.ACTION_EDIT, contactUri).apply {
        putExtra(ContactsContract.Intents.Insert.PHONE, phone)
    }
    context.startActivity(intent)
}

 

Kontakt auswählen: Kontaktauswahl verwenden

Wenn Sie nur Kontakte lesen müssen, die der Nutzer auswählt, verwenden Sie die Kontaktauswahl, die ab Android 17 verfügbar ist. Es ist keine Berechtigung erforderlich.

Apps für Anrufe und Nachrichten: Personenverzeichnis verwenden

Einige Apps fügen Kontakten Aktionen wie „Anrufen mit…“ oder „Nachricht senden mit…“ hinzu, damit Nutzer einen Anruf oder Chat über die Telefon oder Kontakte App starten können. Wenn Ihre App dies derzeit tut, indem sie zusätzliche Einträge in die Kontakte des Nutzers schreibt, wechseln Sie zum Personenverzeichnis, das in Android QPR2 (4. Quartal 2026) eingeführt wird. Es handelt sich um ein neues Systemverzeichnis, in dem Ihre App veröffentlicht, wie Nutzer sich in Ihrer App gegenseitig erreichen können, ohne die Kontakte des Nutzers zu bearbeiten.

Beispiele für die Migration von Apps

Hier sind einige Beispiele dafür, wie verschiedene Arten von Apps den Zugriff auf Kontakte umsetzen können:

Beispiel für einen App-Typ (nicht exklusiv).Empfohlener Migrationspfad
Apps für soziale Netzwerke, P2P-Zahlungen und FahrdiensteWenn Nutzer in Ihrer App Freunde finden, eine Rechnung aufteilen oder den Status einer Fahrt teilen können, benötigen Sie überhaupt keine Berechtigung „Kontakte“. Verwenden Sie die Kontaktauswahl für die einmalige Auswahl von Kontakten und starten Sie ACTION_INSERT mit EXTRA_PHOTO_URI, wenn ein Nutzer in einem Profil auf „In Kontakten speichern“ tippt.
Visitenkartenscanner und Event-Networking-AppsWenn Ihre App einen Ausweis oder QR-Code scannt und einen neuen Kontakt speichert oder einem vorhandenen Eintrag eines Kollegen eine geschäftliche Telefonnummer hinzufügt, verwenden Sie ACTION_INSERT oder ACTION_INSERT_OR_EDIT. Im standardisierten Editor, der die Hälfte des Bildschirms einnimmt, werden die geparsten Felder (Name, Unternehmen, Telefon, E‑Mail und Foto) vorausgefüllt, sodass der Nutzer sie mit nur einem Tippen prüfen und speichern kann, ohne Hintergrundberechtigungen zu gewähren.
VoIP-Anruf- und Messaging-AppsAnstatt WRITE_CONTACTS aufzufordern, benutzerdefinierte Zeilen wie „Anrufen mit…“ oder „Nachricht senden mit…“ in das Adressbuch des Nutzers einzufügen, veröffentlichen Sie Erreichbarkeitsmetadaten über das Personenverzeichnis und verwenden Sie ACTION_INSERT, wenn Nutzer einen neuen Kontakt aus einem Chat-Thread hinzufügen.
Enterprise-CRM- und Cloud-Synchronisierungs-AppsWenn Ihre App eine kontinuierliche, bidirektionale Kontaktsynchronisierung im Hintergrund mit einem Cloud- oder Arbeitskonto durchführt, bei der es nicht möglich ist, den Nutzer für jeden Datensatz mit einer Intent-UI aufzufordern, kann Ihre App MANAGE_CONTACTS  deklarieren.

Änderungen, die Sie prüfen sollten

  • Benutzerdefinierte Datentypen werden im Editor nicht unterstützt. Wenn Sie Insert.DATA-Zeilen mit anderen MIME-Typen als den Standard-ContactsContract.CommonDataKinds-Typen übergeben, werden diese MIME-Typen vom Editor ignoriert.
  • SHOW_OR_CREATE_CONTACT wird nicht vom Systemeditor verarbeitet. Auf dem Gerät vorinstallierte Kontakte-Apps können die Anfrage jedoch weiterhin verarbeiten. Verwenden Sie ACTION_INSERT_OR_EDIT, um ein einheitliches Verhalten auf allen Geräten zu erzielen.
  • Schreibvorgänge schlagen standardmäßig fehl. Sobald Sie den anstehenden Android-Release als Ziel festlegen, führt jeder direkte Schreibvorgang ohne MANAGE_CONTACTS zu einem SecurityException or permission denial. Testen Sie die Funktion.

Brauche ich MANAGE_CONTACTS?

Wahrscheinlich nicht. Wenn Ihre App Kontakte speichert oder bearbeitet, weil ein Nutzer sie dazu aufgefordert hat, sind Sie mit den oben genannten Intents abgedeckt, ohne dass eine Berechtigung oder eine Erklärung in der Play Console erforderlich ist.

MANAGE_CONTACTS ist für Apps gedacht, deren Hauptzweck die Verwaltung von Kontakten ist und bei denen die Intents nicht ausreichen. Beispiel:

Ihre App…Benötigen Sie MANAGE_CONTACTS?
Speichert einen Kontakt aus einem Chat, einer Visitenkarte oder einer Bestellung.Nein,ACTION_INSERT verwenden
Fügt einem bestehenden Kontakt eine Nummer oder E‑Mail-Adresse hinzu.Nein,verwenden Sie ACTION_INSERT_OR_EDIT oder ACTION_EDIT.
Ermöglicht Nutzern, Kontakte auszuwählen, um sie einzuladen, etwas mit ihnen zu teilen oder sie zu bezahlen.Nein,ich verwende die Kontaktauswahl.
Fügt Kontakten Anruf- oder Nachrichtenaktionen hinzu.Nein,Personenverzeichnis verwenden
Hat einen eigenen Bildschirm zum Bearbeiten von Kontakten mit Branding.Nein,eine benutzerdefinierte Oberfläche allein reicht nicht aus.
Es handelt sich um eine dedizierte App zur Kontaktverwaltung oder zum Ersetzen der Telefon-App.Wahrscheinlich ja
Eine App für Anrufer-ID und Spamschutz, die Adressbucheinträge in großer Zahl aktualisiert.Wahrscheinlich ja
Synchronisiert Kontakte im Hintergrund mit einem Unternehmens- oder Cloud-Konto.Wahrscheinlich ja
Führt eine Massensicherung oder -wiederherstellung von Kontakten oder eine Übertragung von einem Smartphone auf ein anderes durch.Wahrscheinlich ja
Benutzerdefinierte Klingeltöne für einzelne Kontakte festlegenWahrscheinlich ja

So funktioniert's:

  • MANAGE_CONTACTS ist eine Berechtigung vom Typ „Spezieller App-Zugriff“. Es ist kein Laufzeitdialogfeld. Nutzer können die Funktion unter Einstellungen > Spezieller App-Zugriff > Kontakte verwalten aktivieren.
// Opens Settings > Apps > Special app access > Manage contacts
val intent = Intent(Settings.ACTION_MANAGE_CONTACTS, Uri.fromParts("package", packageName, null))
context.startActivity(intent)
  • Sie umfasst das Lesen, Hinzufügen, Bearbeiten und Löschen von Kontakten, Konten und Daten im Personenverzeichnis. Sie müssen nicht auch noch READ_CONTACTS anfordern.
  • Wenn Sie Ihre App mit MANAGE_CONTACTS bei Google Play veröffentlichen möchten, müssen Sie in der Play Console eine Erklärung einreichen, in der Sie darlegen, warum die Intents für die Hauptfunktion Ihrer App nicht ausreichen.

Migrationsschritte

  • Suchen Sie nach Ihren Kontaktschreibvorgängen. Suchen Sie in Ihrem Code nach WRITE_CONTACTS, ContactsContract.RawContacts.CONTENT_URI, ContactsContract.Data.CONTENT_URI und applyBatch(ContactsContract.AUTHORITY, …).
  • Ersetzen Sie jeden nutzergesteuerten Schreibvorgang durch einen Intent:ACTION_INSERT für neue Kontakte und ACTION_EDIT oder ACTION_INSERT_OR_EDIT für Aktualisierungen.
  • Verwenden Sie nur Standarddatentypen in Insert.DATA. Anruf- oder Nachrichtenaktionen in das Personenverzeichnis verschieben.
  • Entscheiden Sie anhand der Tabelle oben, ob Sie MANAGE_CONTACTS wirklich benötigen. Wenn ja, planen Sie Ihre Erklärung in der Play Console.
  • Entfernen Sie WRITE_CONTACTS aus Ihrem Manifest, sobald kein Codepfad mehr darauf zugreifen muss.

Zeitachse

WannWas passiert dann?
21. Oktober 2026Google Play kündigt die Richtlinie zu MANAGE_CONTACTS an
2026 (Android 17 Quarterly Platform Release 2)Berechtigung „MANAGE_CONTACTS“ wird verfügbar
2027 (Anstehender Android-Release)WRITE_CONTACTS gewährt Apps, die auf die kommende Android-Version ausgerichtet sind, keinen Schreibzugriff mehr. Kontakt-Intents sind auf allen Geräten standardisiert.
2027, nicht vor dem nächsten Android-ReleaseIn der Play Console werden Entwickler von Apps, die MANAGE_CONTACTS verwenden, aufgefordert, eine Erklärung abzugeben
2027, nicht vor dem nächsten Android-ReleaseEinhaltung der Google Play-Richtlinien erforderlich

FAQ

  • Betrifft das alle Apps?
    • Die Einstellung von WRITE_CONTACTS gilt nur für Apps, die auf die kommende Android-Version und höher ausgerichtet sind. Apps, die auf ältere Versionen ausgerichtet sind, behalten ihr aktuelles Verhalten bei. Der neue standardisierte Kontakteditor ist jedoch für alle Apps verfügbar, die auf dem neuen Betriebssystem ausgeführt werden, unabhängig von ihrem Ziel-SDK.
  • Kann meine App Kontakte mit Intent löschen?
    • Nein. Es gibt keinen Intent zum Löschen von Kontakten. Nutzer löschen Kontakte in ihrer Kontakte App. Apps mit MANAGE_CONTACTS können Kontakte direkt löschen.
  • Ich habe bereits einen eigenen Bildschirm zum Bearbeiten von Kontakten. Kann ich es behalten?
    • Nur wenn Ihre App die Voraussetzungen für MANAGE_CONTACTS erfüllt. Der Wunsch, ein benutzerdefiniertes Design beizubehalten, ist allein kein ausreichender Grund.
  • Ersetzt MANAGE_CONTACTS die Berechtigung READ_CONTACTS?
    • MANAGE_CONTACTS umfasst Lesezugriff, sodass Sie nicht beide Berechtigungen anfordern müssen. Viele Apps, die für READ_CONTACTS infrage kommen, müssen Kontakte jedoch überhaupt nicht ändern. Diese Apps können weiterhin READ_CONTACTS anfordern.
  • Was ist mit meinen Nutzern, die ältere Android-Versionen verwenden?
    • Die Kontakt-Intents funktionieren auch auf älteren Versionen und werden von der Kontakte App des Geräts verarbeitet. Die meisten Apps funktionieren auf allen Geräten mit diesen Intents gut. Wenn Ihre App von einem bestimmten Konsistenzproblem betroffen ist, das nur in den aktuellen Versionen behoben wurde, können Sie die Berechtigung WRITE_CONTACTS in Ihrem Manifest mit einer entsprechenden maxSdkVersion beibehalten.
Weiterlesen