modyfikowanie kontaktów na podstawie intencji,

Z tej lekcji dowiesz się, jak za pomocą pola Intent wstawić nowy kontakt lub zmodyfikować jego dane. Zamiast bezpośrednio uzyskiwać dostęp do dostawcy kontaktów, Intent uruchamia aplikację kontaktów, która uruchamia odpowiednią Activity. W przypadku działań modyfikacji opisanych w tej lekcji jeśli wysyłasz rozszerzone dane w Intent, które są wpisane w interfejsie Activity, które zostało uruchomione.

Użycie elementu Intent do wstawienia lub zaktualizowania pojedynczego kontaktu jest preferowanym sposobem modyfikowania dostawcy kontaktów z tych powodów:

  • Pozwala zaoszczędzić czas i siły potrzebne do opracowania własnego interfejsu i kodu.
  • Pozwala to uniknąć błędów spowodowanych modyfikacjami, które nie są zgodne z Reguły dostawcy kontaktów.
  • Zmniejsza to liczbę uprawnień, o które musisz poprosić. Aplikacja nie potrzebuje uprawnień do zapisu w dostawcy kontaktów, ponieważ przekazuje on informacje o modyfikacjach aplikacji do obsługi kontaktów, które już mają to uprawnienie.

Wstawianie nowego kontaktu za pomocą zamiaru

Często możesz chcieć zezwolić użytkownikowi na wstawienie nowego kontaktu, gdy aplikacja otrzyma nowe dane. Na przykład aplikacja do przeglądania restauracji może umożliwiać użytkownikom dodawanie restauracji jako kontaktu podczas jej przeglądania. Aby to zrobić za pomocą intencji, utwórz intencję przy użyciu jak największej ilości danych i wysyłać intencję do aplikacji Kontakty.

Wstawienie kontaktu w aplikacji Kontakty powoduje wstawienie do Kontaktów nowego nieprzetworzonego kontaktu Tabela ContactsContract.RawContacts dostawcy. W razie potrzeby aplikacja Kontakty poprosi użytkowników o wybranie typu konta i konta, którego mają użyć do utworzenia surowego kontaktu. Aplikacja Kontakty powiadamia też użytkowników, jeśli nieprzetworzony kontakt już istnieje. Użytkownicy mogą anulować wstawienie, w którym przypadku nie zostanie utworzony kontakt. Aby się uczyć o nieprzetworzonych kontaktach znajdziesz Dostawca kontaktów Przewodnik po interfejsie API

Tworzenie intencji

Najpierw utwórz nowy obiekt Intent z działaniem. Intents.Insert.ACTION Ustaw typ MIME na RawContacts.CONTENT_TYPE. Na przykład:

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);

Jeśli masz już dane kontaktowe, takie jak numer telefonu lub adres e-mail, możesz je wstawić w intencji jako rozszerzone dane. W przypadku wartości klucza użyj odpowiedniej stałej z tabeli Intents.Insert. Aplikacja Kontakty wyświetla dane na ekranie wstawiania, umożliwiając użytkownikom wprowadzanie dalszych zmian i uzupełnień.

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);

Po utworzeniu Intent wyślij go, wywołując funkcję startActivity().

Kotlin

    /* Sends the Intent
     */
    startActivity(intent)

Java

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

Wywołanie tej metody powoduje wyświetlenie w aplikacji Kontakty ekranu, na którym użytkownicy mogą wpisać nowy kontakt. Typ i nazwa konta kontaktu są widoczne u góry ekranu. Gdy użytkownicy wpiszą dane i klikną Gotowe, pojawi się lista kontaktów w aplikacji Kontakty. Użytkownicy wracają do aplikacji, klikając Wstecz.

Edytowanie istniejącego kontaktu za pomocą intencji

Edytowanie istniejącego kontaktu za pomocą elementu Intent jest przydatne, jeśli użytkownik Użytkownik wybrał już interesujący Cię kontakt. Na przykład aplikacja, która wyszukuje kontakty zawierające adresów pocztowych, ale bez kodu pocztowego umożliwiłoby wyszukiwanie kodu a następnie dodanie go do kontaktu.

Aby edytować istniejący kontakt za pomocą intencji, wykonaj procedurę podobną do przez wstawienie kontaktu. Utwórz intencję w sposób opisany w sekcji Wstaw nowy kontakt za pomocą intencji, ale dodaj jego adres Contacts.CONTENT_LOOKUP_URI i typ MIME Contacts.CONTENT_ITEM_TYPE do intencji. Jeśli chcesz edytować kontakt, podając dane już posiadane, możesz je umieścić w rozszerzonych danych intencji. Zwróć uwagę, że niektóre kolumn nazw nie można edytować za pomocą intencji; te kolumny są wymienione w podsumowaniu sekcji dokumentacji API klasy ContactsContract.Contacts pod nagłówkiem „Aktualizacja”.

Na koniec prześlij intencję. W odpowiedzi aplikacja Kontakty wyświetli ekran edycji. Gdy użytkownik zakończy edycję i zapisze zmiany, aplikacja Kontakty wyświetli listę kontaktów. Gdy użytkownik kliknij Wstecz, aplikacja wyświetli się.

Tworzenie intencji

Aby edytować kontakt, wywołaj funkcję Intent(action), aby utworzyć intencję z działaniem ACTION_EDIT. Zadzwoń do nas setDataAndType(), aby ustawić wartość danych dla parametru dla intencji Contacts.CONTENT_LOOKUP_URI kontaktu i typu MIME Contacts.CONTENT_ITEM_TYPE typ MIME; bo połączenie do setType() zastępuje bieżącą wartość danych dla parametru Intent, musisz skonfigurować dane i typ MIME jednocześnie.

Aby uzyskać wartość Contacts.CONTENT_LOOKUP_URI kontaktu, wywołaj funkcję Contacts.getLookupUri(id, lookupkey), podając jako argumenty wartości Contacts._ID i Contacts.LOOKUP_KEY.

Uwaga: wartość LOOKUP_KEY kontaktu to identyfikator, którego należy użyć do pobrania kontaktu. Stała, nawet jeśli dostawca zmieni identyfikator wiersza kontaktu na potrzeby operacji wewnętrznych.

Z tego fragmentu kodu dowiesz się, jak utworzyć intencję:

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);

Dodawanie flagi nawigacyjnej

W Androidzie 4.0 (wersja interfejsu API 14) i nowszych, problem w aplikacji Kontakty powoduje nieprawidłowe działanie nawigacji. Gdy aplikacja wysyła do aplikacji Kontakty intencję edycji, a użytkownicy edytują i zapisują kontakt, po kliknięciu Wstecz widzą ekran listy kontaktów. Aby wrócić do Twojej aplikacji, musi kliknąć Ostatnie i wybrać aplikację.

Aby obejść ten problem w Androidzie 4.0.3 (wersja interfejsu API 15) i nowszych, dodaj do intencjonalny klucz danych finishActivityOnSaveCompleted o wartości true. Wersje Androida starsze niż 4.0 akceptują ten klucz, ale nie ma to żadnego efektu. Aby ustawić parametr rozszerzone dane, wykonaj te czynności:

Kotlin

    // Sets the special extended data for navigation
    editIntent.putExtra("finishActivityOnSaveCompleted", true)

Java

    // Sets the special extended data for navigation
    editIntent.putExtra("finishActivityOnSaveCompleted", true);

Dodawanie innych rozszerzonych danych

Aby dodać więcej rozszerzonych danych do urządzenia Intent, zadzwoń pod numer putExtra(). Możesz dodawać rozszerzone dane do typowych pól kontaktowych, używając wartości kluczy określonych w Intents.Insert. Pamiętaj, że niektóre Nie można zmienić kolumn w tabeli ContactsContract.Contacts. Te kolumny są wymienione w sekcji podsumowania w dokumentacji interfejsu API dotyczącej klasy ContactsContract.Contacts pod nagłówkiem „Aktualizacja”.

Wysyłanie intencji

Na koniec prześlij utworzoną intencję. Na przykład:

Kotlin

    // Sends the Intent
    startActivity(editIntent)

Java

    // Sends the Intent
    startActivity(editIntent);

Pozwól użytkownikom wstawić lub edytować dane na podstawie intencji

Możesz zezwolić użytkownikom na wybór, czy chcą wstawić nowy kontakt czy zmodyfikować istniejący. Aby to zrobić, wyślij Intent z działaniem ACTION_INSERT_OR_EDIT. Na przykład aplikacja klienta poczty e-mail może zezwalać użytkownikom na dodawanie przychodzącego adresu e-mail do nowego kontaktu lub jako dodatkowego adresu do istniejącego kontaktu. Ustaw typ MIME dla tej intencji na Contacts.CONTENT_ITEM_TYPE, ale nie ustawiaj identyfikatora URI danych.

Gdy wyślesz tę intencję, aplikacja Kontakty wyświetli listę kontaktów. Użytkownicy mogą wstawić nowy kontakt lub wybrać istniejący kontakt i go edytować. Wszystkie rozszerzone pola danych dodane do intencji wypełniają wyświetlony ekran. Za pomocą dowolną z par klucz-wartość podanych w funkcji Intents.Insert. Fragment kodu poniżej pokazuje, jak utworzyć i przesłać intencję:

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);