In dieser Lektion erfahren Sie, wie Sie mit Intent
einen neuen Kontakt einfügen oder dessen Daten ändern. Anstatt direkt auf den Kontakteanbieter zuzugreifen, startet ein Intent
die Kontakte-App, die den entsprechenden Activity
ausführt. Wenn Sie bei den in dieser Lektion beschriebenen Änderungsaktionen erweiterte Daten im Intent
senden, werden diese in die UI des gestarteten Activity
eingegeben.
Die Verwendung eines Intent
zum Einfügen oder Aktualisieren eines einzelnen Kontakts ist aus den folgenden Gründen die bevorzugte Methode, um den Contacts Provider zu ändern:
- Sie sparen Zeit und Aufwand, weil Sie keine eigene Benutzeroberfläche und keinen eigenen Code entwickeln müssen.
- Dadurch werden Fehler vermieden, die durch Änderungen verursacht werden, die nicht den Regeln des Kontaktanbieters entsprechen.
- Dadurch müssen Sie weniger Berechtigungen anfordern. Ihre App benötigt keine Berechtigung zum Schreiben an den Kontakteanbieter, da Änderungen an die Kontakte-App delegiert werden, die diese Berechtigung bereits hat.
Neuen Kontakt mit einem Intent einfügen
Häufig möchten Sie Nutzern erlauben, einen neuen Kontakt einzufügen, wenn Ihre App neue Daten erhält. In einer App für Restaurantrezensionen können Nutzer das Restaurant beispielsweise als Kontakt hinzufügen, während sie eine Rezension schreiben. Dazu verwenden Sie einen Intent. Dazu verwenden Sie möglichst viele Daten, um den Intent zu erstellen, und senden ihn dann an die Kontakte App.
Wenn Sie einen Kontakt mithilfe der Kontakte-App einfügen, wird ein neuer Rohkontakt in die Tabelle ContactsContract.RawContacts
des Kontaktanbieters eingefügt. Bei Bedarf werden Nutzer von der Kontakte-App aufgefordert, den Kontotyp und das Konto anzugeben, die beim Erstellen des Rohkontakts verwendet werden sollen. Die Kontakte App benachrichtigt Nutzer auch, wenn der unbearbeitete Kontakt bereits vorhanden ist. Nutzer haben dann die Möglichkeit, das Einfügen abzubrechen. In diesem Fall wird kein Kontakt erstellt. Weitere Informationen zu Rohkontakten finden Sie im API-Leitfaden für Contacts Provider.
Intent erstellen
Erstellen Sie zuerst ein neues Intent
-Objekt mit der Aktion Intents.Insert.ACTION
.
Legen Sie als MIME-Typ RawContacts.CONTENT_TYPE
fest. Beispiele:
Kotlin
... // Creates a new Intent to insert a contact val intent = Intent(ContactsContract.Intents.Insert.ACTION).apply { // Sets the MIME type to match the Contacts Provider type = ContactsContract.RawContacts.CONTENT_TYPE }
Java
... // Creates a new Intent to insert a contact Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION); // Sets the MIME type to match the Contacts Provider intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
Wenn Sie bereits Kontaktdetails wie eine Telefonnummer oder E-Mail-Adresse haben, können Sie sie als erweiterte Daten in den Intent einfügen. Verwenden Sie für ein Schlüssel/Wert-Paar die entsprechende Konstante aus Intents.Insert
. Die Daten werden in der Kontakte-App auf dem Einfügebildschirm angezeigt, über den Nutzer weitere Änderungen und Ergänzungen vornehmen können.
Kotlin
private var emailAddress: EditText? = null private var phoneNumber: EditText? = null ... /* Assumes EditText fields in your UI contain an email address * and a phone number. * */ emailAddress = findViewById(R.id.email) phoneNumber = findViewById(R.id.phone) ... /* * Inserts new data into the Intent. This data is passed to the * contacts app's Insert screen */ intent.apply { // Inserts an email address putExtra(ContactsContract.Intents.Insert.EMAIL, emailAddress?.text) /* * In this example, sets the email type to be a work email. * You can set other email types as necessary. */ putExtra( ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK ) // Inserts a phone number putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber?.text) /* * In this example, sets the phone type to be a work phone. * You can set other phone types as necessary. */ putExtra( ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK ) }
Java
private EditText emailAddress = null; private EditText phoneNumber = null; ... /* Assumes EditText fields in your UI contain an email address * and a phone number. * */ emailAddress = (EditText) findViewById(R.id.email); phoneNumber = (EditText) findViewById(R.id.phone); ... /* * Inserts new data into the Intent. This data is passed to the * contacts app's Insert screen */ // Inserts an email address intent.putExtra(ContactsContract.Intents.Insert.EMAIL, emailAddress.getText()) /* * In this example, sets the email type to be a work email. * You can set other email types as necessary. */ .putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) // Inserts a phone number .putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber.getText()) /* * In this example, sets the phone type to be a work phone. * You can set other phone types as necessary. */ .putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
Nachdem Sie die Intent
erstellt haben, können Sie sie senden, indem Sie startActivity()
aufrufen.
Kotlin
/* Sends the Intent */ startActivity(intent)
Java
/* Sends the Intent */ startActivity(intent);
Bei diesem Anruf wird in der Kontakte App ein Bildschirm geöffnet, in dem Nutzer einen neuen Kontakt eingeben können. Der Kontotyp und der Kontoname des Kontakts werden oben auf dem Bildschirm angezeigt. Nachdem Nutzer die Daten eingegeben und auf Fertig geklickt haben, wird die Kontaktliste der Kontakte-App angezeigt. Die Nutzer kehren zu Ihrer App zurück, indem sie auf Zurück klicken.
Vorhandenen Kontakt mit einem Intent bearbeiten
Das Bearbeiten eines vorhandenen Kontakts mit einem Intent
ist hilfreich, wenn der Nutzer bereits einen relevanten Kontakt ausgewählt hat. Beispielsweise kann eine Anwendung, die Kontakte mit Postanschriften ohne Postleitzahl findet, Nutzern die Möglichkeit bieten, den Code zu suchen und dem Kontakt hinzuzufügen.
Wenn Sie einen vorhandenen Kontakt mithilfe eines Intents bearbeiten möchten, gehen Sie ähnlich wie beim Einfügen eines Kontakts vor. Erstellen Sie einen Intent wie im Abschnitt Neuen Kontakt mithilfe eines Intents einfügen beschrieben. Fügen Sie dem Intent jedoch die Contacts.CONTENT_LOOKUP_URI
des Kontakts und den MIME-Typ Contacts.CONTENT_ITEM_TYPE
hinzu. Wenn Sie den Kontakt mit bereits vorhandenen Details bearbeiten möchten, können Sie ihn in die erweiterten Daten des Intents aufnehmen. Einige Namensspalten können nicht mit einem Intent bearbeitet werden. Diese Spalten sind in der Zusammenfassung der API-Referenz für die Klasse ContactsContract.Contacts
unter der Überschrift „Update“ aufgeführt.
Zum Schluss senden Sie den Intent. Die Kontakte App zeigt daraufhin einen Bearbeitungsbildschirm an. Wenn der Nutzer mit der Bearbeitung fertig ist und die Änderungen speichert, wird in der Kontakte-App eine Kontaktliste angezeigt. Wenn der Nutzer auf Zurück klickt, wird Ihre App angezeigt.
Intent erstellen
Rufen Sie zum Bearbeiten eines Kontakts Intent(action)
auf, um einen Intent mit der Aktion ACTION_EDIT
zu erstellen. Rufen Sie setDataAndType()
auf, um den Datenwert für den Intent auf den Contacts.CONTENT_LOOKUP_URI
des Kontakts und den MIME-Typ auf den MIME-Typ Contacts.CONTENT_ITEM_TYPE
zu setzen. Da ein Aufruf von setType()
den aktuellen Datenwert für Intent
überschreibt, müssen Sie die Daten und den MIME-Typ gleichzeitig festlegen.
Um den Contacts.CONTENT_LOOKUP_URI
eines Kontakts abzurufen, rufen Sie Contacts.getLookupUri(id, lookupkey)
mit den Werten Contacts._ID
und Contacts.LOOKUP_KEY
des Kontakts als Argumente auf.
Hinweis:Der Wert LOOKUP_KEY
eines Kontakts ist die Kennung, die Sie zum Abrufen eines Kontakts verwenden sollten. Sie bleibt konstant, auch wenn der Anbieter die Zeilen-ID des Kontakts ändert, um interne Vorgänge abzuwickeln.
Das folgende Snippet zeigt, wie Sie einen Intent erstellen:
Kotlin
// The Cursor that contains the Contact row var mCursor: Cursor? = null // The index of the lookup key column in the cursor var lookupKeyIndex: Int = 0 // The index of the contact's _ID value var idIndex: Int = 0 // The lookup key from the Cursor var currentLookupKey: String? = null // The _ID value from the Cursor var currentId: Long = 0 // A content URI pointing to the contact var selectedContactUri: Uri? = null ... /* * Once the user has selected a contact to edit, * this gets the contact's lookup key and _ID values from the * cursor and creates the necessary URI. */ mCursor?.apply { // Gets the lookup key column index lookupKeyIndex = getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY) // Gets the lookup key value currentLookupKey = getString(lookupKeyIndex) // Gets the _ID column index idIndex = getColumnIndex(ContactsContract.Contacts._ID) currentId = getLong(idIndex) selectedContactUri = ContactsContract.Contacts.getLookupUri(currentId, mCurrentLookupKey) } // Creates a new Intent to edit a contact val editIntent = Intent(Intent.ACTION_EDIT).apply { /* * Sets the contact URI to edit, and the data type that the * Intent must match */ setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE) }
Java
// The Cursor that contains the Contact row public Cursor mCursor; // The index of the lookup key column in the cursor public int lookupKeyIndex; // The index of the contact's _ID value public int idIndex; // The lookup key from the Cursor public String currentLookupKey; // The _ID value from the Cursor public long currentId; // A content URI pointing to the contact Uri selectedContactUri; ... /* * Once the user has selected a contact to edit, * this gets the contact's lookup key and _ID values from the * cursor and creates the necessary URI. */ // Gets the lookup key column index lookupKeyIndex = mCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY); // Gets the lookup key value currentLookupKey = mCursor.getString(lookupKeyIndex); // Gets the _ID column index idIndex = mCursor.getColumnIndex(ContactsContract.Contacts._ID); currentId = mCursor.getLong(idIndex); selectedContactUri = Contacts.getLookupUri(currentId, mCurrentLookupKey); ... // Creates a new Intent to edit a contact Intent editIntent = new Intent(Intent.ACTION_EDIT); /* * Sets the contact URI to edit, and the data type that the * Intent must match */ editIntent.setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE);
Navigations-Flag hinzufügen
Unter Android 4.0 (API-Version 14) und höher führt ein Problem in der Kontakte-App zu einer falschen Navigation. Wenn Ihre App einen Bearbeitungs-Intent an die Kontakte-App sendet und Nutzer einen Kontakt bearbeiten und speichern, wird beim Klicken auf Zurück der Bildschirm mit der Kontaktliste angezeigt. Um zu Ihrer App zurückzukehren, müssen sie auf Zuletzt verwendet klicken und Ihre App auswählen.
Um dieses Problem in Android 4.0.3 (API-Version 15) und höher zu umgehen, fügen Sie dem Intent den erweiterten Datenschlüssel finishActivityOnSaveCompleted
mit dem Wert true
hinzu.
Android-Versionen vor Android 4.0 akzeptieren diesen Schlüssel, er hat aber keine Auswirkungen. So legen Sie die erweiterten Daten fest:
Kotlin
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true)
Java
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true);
Weitere erweiterte Daten hinzufügen
Rufen Sie putExtra()
nach Bedarf auf, um dem Intent
zusätzliche erweiterte Daten hinzuzufügen.
Mithilfe der in Intents.Insert
angegebenen Schlüssel/Wert-Paare können Sie erweiterte Daten für gängige Kontaktfelder hinzufügen. Einige Spalten in der Tabelle ContactsContract.Contacts
können nicht geändert werden.
Diese Spalten sind im Zusammenfassungsabschnitt der API-Referenz für die Klasse ContactsContract.Contacts
unter der Überschrift „Aktualisieren“ aufgeführt.
Intent senden
Zum Schluss senden Sie den von Ihnen erstellten Intent. Beispiele:
Kotlin
// Sends the Intent startActivity(editIntent)
Java
// Sends the Intent startActivity(editIntent);
Nutzern die Möglichkeit geben, mit einem Intent einzufügen oder zu bearbeiten
Nutzer können auswählen, ob sie einen Kontakt einfügen oder einen vorhandenen bearbeiten möchten. Dazu senden Sie eine Intent
mit der Aktion ACTION_INSERT_OR_EDIT
. Eine E-Mail-Client-Anwendung könnte Nutzern beispielsweise ermöglichen, eine eingehende E-Mail-Adresse einem neuen Kontakt hinzuzufügen oder sie als zusätzliche Adresse für einen vorhandenen Kontakt hinzuzufügen. Legen Sie den MIME-Typ für diesen Intent auf Contacts.CONTENT_ITEM_TYPE
fest, aber legen Sie den Daten-URI nicht fest.
Wenn Sie diesen Intent senden, wird in der Kontakte App eine Liste der Kontakte angezeigt.
Die Nutzer können entweder einen neuen Kontakt einfügen oder einen vorhandenen Kontakt auswählen und bearbeiten.
Alle erweiterten Datenfelder, die Sie dem Intent hinzufügen, werden auf dem angezeigten Bildschirm ausgefüllt. Sie können jeden der in Intents.Insert
angegebenen Schlüssel/Wert-Paare verwenden. Das folgende Code-Snippet zeigt, wie der Intent erstellt und gesendet wird:
Kotlin
// Creates a new Intent to insert or edit a contact val intentInsertEdit = Intent(Intent.ACTION_INSERT_OR_EDIT).apply { // Sets the MIME type type = ContactsContract.Contacts.CONTENT_ITEM_TYPE } // Add code here to insert extended data, if desired // Sends the Intent with an request ID startActivity(intentInsertEdit)
Java
// Creates a new Intent to insert or edit a contact Intent intentInsertEdit = new Intent(Intent.ACTION_INSERT_OR_EDIT); // Sets the MIME type intentInsertEdit.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); // Add code here to insert extended data, if desired ... // Sends the Intent with an request ID startActivity(intentInsertEdit);