Kontakte mithilfe von Intents ändern

In dieser Lektion erfahren Sie, wie Sie mit einem Intent einen neuen Kontakt oder die Daten eines Kontakts ändern. Anstatt direkt auf den Kontaktdatenanbieter zuzugreifen, startet eine Intent die Kontakte App, die die entsprechende Activity ausführt. Bei den in dieser Lektion beschriebenen Änderungsaktionen Wenn Sie erweiterte Daten mit dem Intent senden, werden diese auf der Benutzeroberfläche des Activity gestartet.

Die Verwendung einer Intent zum Einfügen oder Aktualisieren eines einzelnen Kontakts ist aus folgenden Gründen die bevorzugte Methode, den Kontaktdatenanbieter zu ändern:

  • Sie sparen Zeit und Mühe bei der Entwicklung Ihrer eigenen Benutzeroberfläche und Ihres eigenen Codes.
  • So werden Fehler vermieden, die durch Änderungen verursacht werden, die nicht den Regeln des Kontaktanbieters entsprechen.
  • So müssen Sie weniger Berechtigungen anfordern. Deine App benötigt keine Berechtigung an den Kontakte-Anbieter zu schreiben, da er Änderungen an der Kontakte-App delegiert, die bereits diese Berechtigung hat.

Neuen Kontakt mithilfe eines Intents einfügen

Sie möchten dem Nutzer oft erlauben, einen neuen Kontakt hinzuzufügen, wenn Ihre App neue Daten empfängt. Für Beispiel: In einer App für Restaurantbewertungen können Nutzer das Restaurant als Kontakt hinzufügen, überprüfen. Um dies mit einem Intent zu tun, erstellen Sie den Intent mit so vielen Daten wie Sie haben und senden den Intent dann an die Kontakte-App.

Beim Einfügen eines Kontakts über die Kontakte App wird ein neuer unformatierter Kontakt in Google Kontakte eingefügt. Tabelle ContactsContract.RawContacts des Anbieters. Falls erforderlich, werden Nutzer in der Kontakte App aufgefordert, den Kontotyp und das Konto anzugeben, das beim Erstellen des Rohkontakts verwendet werden soll. Die Kontakte App benachrichtigt Nutzer auch, wenn der Rohkontakt bereits vorhanden ist. Die Nutzenden haben dann Option zum Abbrechen der Einfügung. In diesem Fall wird kein Kontakt erstellt. Weitere Informationen zu Rohkontakten finden Sie im API-Leitfaden für den Kontaktanbieter.

Intent erstellen

Erstellen Sie zuerst ein neues Intent-Objekt mit der Aktion Intents.Insert.ACTION. Legen Sie als MIME-Typ RawContacts.CONTENT_TYPE fest. Beispiel:

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 Details für den Kontakt haben, z. B. eine Telefonnummer oder E-Mail-Adresse, können Sie diese als erweiterte Daten in die Intent-Definition einfügen. Verwenden Sie für einen Schlüsselwert die entsprechende Konstante aus Intents.Insert Die Kontakt-App zeigt die Daten auf dem Einfügebildschirm an, sodass 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 du die Intent erstellt hast, kannst du sie senden, indem du startActivity() aufrufst.

Kotlin

    /* Sends the Intent
     */
    startActivity(intent)

Java

    /* Sends the Intent
     */
    startActivity(intent);

Bei diesem Anruf wird in der Kontakte App ein Bildschirm geöffnet, auf dem Nutzer einen neuen Kontakt eingeben können. Der Kontotyp und der Kontoname des Kontakts werden oben auf dem Bildschirm angezeigt. Sobald Nutzende die Daten eingeben und auf Fertig klicken. Daraufhin wird die Kontaktliste der Kontakte App angezeigt. Nutzer kehren zu App angezeigt, indem Sie auf Zurück klicken.

Vorhandenen Kontakt mithilfe eines Intents bearbeiten

Das Bearbeiten eines vorhandenen Kontakts mithilfe eines Intent ist hilfreich, wenn der Nutzer bereits einen Kontakt ausgewählt hat. Beispiel: Eine App, die Kontakte findet, Postadressen aber ohne Postleitzahl bietet Nutzenden die Möglichkeit, den Code nachzuschlagen und und fügen es dann dem Kontakt hinzu.

Wenn Sie einen vorhandenen Kontakt mithilfe eines Intents bearbeiten möchten, gehen Sie ähnlich vor wie beim Einfügen eines Kontakts. Erstellen Sie eine Intent wie im Abschnitt Neuen Kontakt mit einer Intent einfügen beschrieben, fügen Sie der Intent aber 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 diese in die erweiterten Daten der Absicht einfügen. Beachten Sie, dass einige Namensspalten können nicht mit einem Intent bearbeitet werden. werden diese Spalten in der Zusammenfassung der API-Referenz für die Klasse ContactsContract.Contacts unter der Überschrift „Aktualisieren“.

Senden Sie abschließend den Intent. Daraufhin wird in der Kontakte App ein Bearbeitungsbildschirm angezeigt. Wenn Nutzende die Bearbeitung beendet und die Änderungen speichert, wird in der Kontakte App eine Kontaktliste angezeigt. Wenn Nutzende auf Zurück klickt, wird die App angezeigt.

Intent erstellen

Wenn Sie einen Kontakt bearbeiten möchten, rufen Sie Intent(action) auf, um einen Intent mit der Aktion ACTION_EDIT zu erstellen. Anruf setDataAndType(), um den Datenwert für die Intent auf den Contacts.CONTENT_LOOKUP_URI des Kontakts und den MIME-Typ, um Contacts.CONTENT_ITEM_TYPE MIME-Typ; weil ein Aufruf von setType() überschreibt den aktuellen Datenwert für die Intent verwenden, müssen Sie die Daten und den MIME-Typ gleichzeitig festlegen.

Wenn Sie die Contacts.CONTENT_LOOKUP_URI eines Kontakts abrufen möchten, rufen Sie Contacts.getLookupUri(id, lookupkey) mit den Werten Contacts._ID und Contacts.LOOKUP_KEY des Kontakts als Argumente auf.

Hinweis:Die E-Mail-Adresse eines Kontakts Der Wert von LOOKUP_KEY 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 zu verarbeiten.

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 falschen Navigation. Wenn Ihre App eine Bearbeitungsabsicht an die Kontakte App sendet und Nutzer einen Kontakt bearbeiten und speichern, wird beim Klicken auf Zurück der Bildschirm mit der Kontaktliste angezeigt. Wenn er zu Ihrer App zurückkehren möchte, muss er auf Letzte klicken und Ihre App auswählen.

Um dieses Problem unter 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 jedoch keine Auswirkungen. So legen Sie den erweiterten Daten zu verwenden, gehen Sie wie folgt vor:

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

Wenn Sie dem Intent zusätzliche erweiterte Daten hinzufügen möchten, rufen Sie nach Bedarf putExtra() auf. Sie können erweiterte Daten für gemeinsame Kontaktfelder hinzufügen, indem Sie die in den Intents.Insert Denken Sie daran, dass 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 aufgeführt. ContactsContract.Contacts unter der Überschrift „Aktualisieren“.

Intent senden

Senden Sie zum Schluss den erstellten Intent. Beispiel:

Kotlin

    // Sends the Intent
    startActivity(editIntent)

Java

    // Sends the Intent
    startActivity(editIntent);

Nutzern die Möglichkeit geben, Inhalte mithilfe eines Intents einzufügen oder zu bearbeiten

Nutzer können auswählen, ob sie einen Kontakt einfügen oder einen vorhandenen Kontakt bearbeiten möchten, indem sie ein Intent mit der Aktion ACTION_INSERT_OR_EDIT. So kann eine E-Mail-Client-App Nutzern beispielsweise erlauben, einem neuen Kontakt eine E-Mail-Adresse für eingehende E-Mails 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, aber nicht den Daten-URI.

Wenn Sie diesen Intent senden, zeigt die Kontakte-App eine Liste von Kontakten an. Die Nutzer können entweder einen neuen Kontakt einfügen oder einen vorhandenen Kontakt auswählen und bearbeiten. Alle erweiterten Datenfelder, die Sie der Intent-Anfrage hinzufügen, werden auf dem angezeigten Bildschirm angezeigt. Sie können einem der in Intents.Insert angegebenen Schlüssel/Wert-Paare. Das folgende Code-Snippet zeigt, wie die 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);