Eine zuverlässigere Methode zum Hinzufügen und Bearbeiten von Kontakten auf Android-Geräten
Lesezeit: 6 Minuten
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:
Abbildung 1: Neuen Kontakt erstellen *UX nicht endgültig*
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_ACCOUNTschlä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
// 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 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 Fahrdienste | Wenn 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-Apps | Wenn 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-Apps | Anstatt 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-Apps | Wenn 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_CONTACTwird nicht vom Systemeditor verarbeitet. Auf dem Gerät vorinstallierte Kontakte-Apps können die Anfrage jedoch weiterhin verarbeiten. Verwenden SieACTION_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_CONTACTSzu einemSecurityException 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 festlegen | Wahrscheinlich ja |
So funktioniert's:
MANAGE_CONTACTSist 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_CONTACTSanfordern. - Wenn Sie Ihre App mit
MANAGE_CONTACTSbei 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_URIundapplyBatch(ContactsContract.AUTHORITY, …). - Ersetzen Sie jeden nutzergesteuerten Schreibvorgang durch einen Intent:
ACTION_INSERTfür neue Kontakte undACTION_EDIToderACTION_INSERT_OR_EDITfü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_CONTACTSwirklich benötigen. Wenn ja, planen Sie Ihre Erklärung in der Play Console. - Entfernen Sie
WRITE_CONTACTSaus Ihrem Manifest, sobald kein Codepfad mehr darauf zugreifen muss.
Zeitachse
| Wann | Was passiert dann? |
| 21. Oktober 2026 | Google 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-Release | In der Play Console werden Entwickler von Apps, die MANAGE_CONTACTS verwenden, aufgefordert, eine Erklärung abzugeben |
| 2027, nicht vor dem nächsten Android-Release | Einhaltung der Google Play-Richtlinien erforderlich |
FAQ
- Betrifft das alle Apps?
- Die Einstellung von
WRITE_CONTACTSgilt 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.
- Die Einstellung von
- 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_CONTACTSkönnen Kontakte direkt löschen.
- Nein. Es gibt keinen Intent zum Löschen von Kontakten. Nutzer löschen Kontakte in ihrer Kontakte App. Apps mit
- Ich habe bereits einen eigenen Bildschirm zum Bearbeiten von Kontakten. Kann ich es behalten?
- Nur wenn Ihre App die Voraussetzungen für
MANAGE_CONTACTSerfüllt. Der Wunsch, ein benutzerdefiniertes Design beizubehalten, ist allein kein ausreichender Grund.
- Nur wenn Ihre App die Voraussetzungen für
- Ersetzt
MANAGE_CONTACTSdie Berechtigung READ_CONTACTS?MANAGE_CONTACTSumfasst Lesezugriff, sodass Sie nicht beide Berechtigungen anfordern müssen. Viele Apps, die fürREAD_CONTACTSinfrage kommen, müssen Kontakte jedoch überhaupt nicht ändern. Diese Apps können weiterhinREAD_CONTACTSanfordern.
- 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_CONTACTSin Ihrem Manifest mit einer entsprechenden maxSdkVersion beibehalten.
- 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
-
ProduktneuigkeitenAuf der Google I/O 2026 haben wir den Wechsel von Android von einem Betriebssystem zu einem intelligenten System vorgestellt. Wir haben auch gezeigt, wie ihr mit dem System native intelligente Funktionen erstellen und die Leistungsfähigkeit der KI von Google in eure Apps einbinden könnt.
Jingyu Shi • Lesezeit: 2 Minuten -
ProduktneuigkeitenDieses Jahr auf der Google I/O gehen wir über iterative Änderungen hinaus und hin zu einer grundlegenden Veränderung der Art und Weise, wie Apps entwickelt werden. Unsere neuesten Tools sind für die Ära der KI-Agenten konzipiert und bieten Funktionen, die die Produktivität von Android-Entwicklern steigern UND die KI-Agenten, die Sie in Ihrer Codebasis einsetzen, optimieren.
Matthew Warner • Lesezeit: 8 Minuten -
ProduktneuigkeitenWie heute auf der Android Show angekündigt, wird Android von einem Betriebssystem zu einem intelligenten System, das mehr Möglichkeiten für die Interaktion mit Ihren Apps bietet.
Matthew McCullough • Lesezeit: 4 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.