Z tej lekcji dowiesz się, jak używać Intent
do wstawiania nowego kontaktu lub modyfikowania danych kontaktu. Zamiast uzyskiwać bezpośredni dostęp do dostawcy kontaktów, Intent
uruchamia aplikację kontaktów, która uruchamia odpowiednie polecenie Activity
. W przypadku działań związanych z modyfikacją opisanych w tej lekcji wysyłanie rozszerzonych danych za pomocą Intent
jest wprowadzane w interfejsie użytkownika Activity
.
Użycie identyfikatora Intent
do wstawiania lub aktualizowania pojedynczego kontaktu jest preferowanym sposobem modyfikowania dostawcy kontaktów. Przyczyny są następujące:
- Pozwala zaoszczędzić czas i wysiłek związany z tworzeniem własnego UI i kodu.
- Pozwala to uniknąć błędów spowodowanych przez modyfikacje, które są niezgodne z regułami dostawcy kontaktów.
- Zmniejsza to liczbę uprawnień, o które musisz prosić. Twoja aplikacja nie potrzebuje uprawnień do zapisu w usłudze Kontakty, ponieważ przekazuje zmiany do aplikacji Kontakty, która ma już to uprawnienie.
Wstaw nowy kontakt, używając intencji
Często chcesz zezwolić użytkownikowi na wstawienie nowego kontaktu, gdy aplikacja będzie otrzymywać nowe dane. Na przykład aplikacja z opiniami o restauracjach może zezwalać użytkownikom na dodawanie informacji o restauracji do kontaktów podczas wystawiania opinii. Aby to zrobić za pomocą intencji, utwórz intencję na podstawie jak największej ilości danych, a następnie wyślij intencję do aplikacji do obsługi kontaktów.
Wstawienie kontaktu za pomocą aplikacji do obsługi kontaktów powoduje wstawienie nowego nieprzetworzonego kontaktu do tabeli ContactsContract.RawContacts
dostawcy kontaktów. W razie potrzeby aplikacja do obsługi kontaktów prosi o podanie rodzaju konta i konta, którego należy użyć podczas tworzenia nieprzetworzonego kontaktu. Aplikacja do obsługi kontaktów powiadamia też użytkowników, gdy nieprzetworzony kontakt już istnieje. Użytkownicy mogą anulować wstawianie, co oznacza, że kontakt nie jest tworzony. Więcej informacji o nieprzetworzonych kontaktach znajdziesz w przewodniku po interfejsie API Contacts Provider.
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 kontaktu, takie jak numer telefonu lub adres e-mail, możesz wstawić je do intencji jako dane rozszerzone. Jako wartości klucza użyj odpowiedniej stałej z Intents.Insert
. Aplikacja do obsługi kontaktów wyświetla dane na ekranie wstawiania, umożliwiając użytkownikom dalsze edytowanie i dodawanie nowych informacji.
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 obiektu Intent
wyślij go, dzwoniąc do: startActivity()
.
Kotlin
/* Sends the Intent */ startActivity(intent)
Java
/* Sends the Intent */ startActivity(intent);
Zostanie wyświetlony ekran w aplikacji do obsługi kontaktów, na którym użytkownik będzie mógł wpisać nowy kontakt. Rodzaj konta i nazwa konta kontaktu są wyświetlane u góry ekranu. Gdy użytkownicy wpiszą dane i kliknie Gotowe, pojawi się lista kontaktów w aplikacji Kontakty. Użytkownicy mogą wrócić do aplikacji, klikając Wstecz.
Edytowanie istniejącego kontaktu za pomocą intencji
Edytowanie istniejącego kontaktu za pomocą Intent
jest przydatne, jeśli użytkownik już wybrał ten kontakt. Na przykład aplikacja znajdująca kontakty z adresami pocztowymi, ale bez kodu pocztowego, może umożliwić użytkownikom wyszukanie kodu i dodanie go do kontaktu.
Aby edytować istniejący kontakt za pomocą intencji, użyj procedury podobnej do wstawiania kontaktu. Utwórz intencję zgodnie z opisem w sekcji Wstawianie nowego kontaktu za pomocą intencji, ale dodaj do intencji Contacts.CONTENT_LOOKUP_URI
i typ MIME Contacts.CONTENT_ITEM_TYPE
kontaktu. Jeśli chcesz edytować kontakt przy użyciu już posiadanych informacji, możesz umieścić je w rozszerzonych danych intencji. Niektórych kolumn z nazwami nie można edytować za pomocą intencji. Są one wymienione w sekcji podsumowania dla klasy ContactsContract.Contacts
pod nagłówkiem „Update” (Aktualizacja).
Na koniec wyślij intencję. W odpowiedzi aplikacja Kontakty wyświetli ekran edycji. Gdy użytkownik skończy edytować i zapisze zmiany, w aplikacji Kontakty wyświetli się lista kontaktów. Gdy użytkownik kliknie Wstecz, wyświetli się Twoja aplikacja.
Tworzenie intencji
Aby edytować kontakt, zadzwoń pod numer Intent(action)
, aby utworzyć intencję z działaniem ACTION_EDIT
. Wywołaj setDataAndType()
, aby ustawić wartość danych intencji na Contacts.CONTENT_LOOKUP_URI
kontaktu i typ MIME Contacts.CONTENT_ITEM_TYPE
na typ MIME. Wywołanie setType()
zastępuje bieżącą wartość danych Intent
, musisz ustawić dane i typ MIME jednocześnie.
Aby uzyskać Contacts.CONTENT_LOOKUP_URI
kontaktu, wywołaj funkcję Contacts.getLookupUri(id, lookupkey)
, podając jako argumenty wartości Contacts._ID
i Contacts.LOOKUP_KEY
kontaktu.
Uwaga: wartość LOOKUP_KEY
kontaktu to identyfikator, którego należy użyć do pobrania kontaktu. Nie zmienia się, nawet jeśli dostawca zmieni identyfikator wiersza kontaktu, aby obsługiwać operacje wewnętrzne.
Ten fragment kodu pokazuje, 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 nawigacji
W Androidzie 4.0 (wersja API 14) i nowszych problem w aplikacji Kontakty powoduje nieprawidłową nawigację. Gdy aplikacja wysyła intencję zmiany do aplikacji Kontakty, a użytkownicy edytują i zapisują kontakt, po kliknięciu Wstecz wyświetli się ekran z listą kontaktów. Aby wrócić do Twojej aplikacji, muszą oni kliknąć Ostatnie i wybrać aplikację.
Aby obejść ten problem w Androidzie 4.0.3 (interfejs API w wersji 15) i nowszych, dodaj do intencji rozszerzony klucz danych finishActivityOnSaveCompleted
o wartości true
.
Android w wersji starszej niż 4.0 akceptuje ten klucz, ale nie powoduje to żadnych skutków. Aby ustawić 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ć dodatkowe rozszerzone dane do: Intent
, wywołaj putExtra()
według potrzeb.
Możesz dodawać rozszerzone dane dotyczące typowych pól kontaktów, używając par klucz-wartość określonych w specyfikacji Intents.Insert
. Pamiętaj, że niektórych kolumn w tabeli ContactsContract.Contacts
nie można modyfikować.
Te kolumny są wymienione w sekcji podsumowania w dokumentacji interfejsu API klasy ContactsContract.Contacts
pod nagłówkiem „Update” (Aktualizacja).
Wyślij intencję
Na koniec prześlij skonstruowaną intencję. Na przykład:
Kotlin
// Sends the Intent startActivity(editIntent)
Java
// Sends the Intent startActivity(editIntent);
Pozwalaj użytkownikom na wstawianie i edytowanie treści na podstawie intencji
Możesz pozwolić użytkownikom zdecydować, czy chcą wstawić kontakt, czy edytować istniejący, wysyłając użytkownikowi Intent
z działaniem ACTION_INSERT_OR_EDIT
. Klient poczty e-mail może na przykład zezwolić użytkownikom na dodawanie przychodzącego adresu e-mail do nowego kontaktu lub jako dodatkowy adres dla istniejącego kontaktu. Ustaw typ MIME tej intencji na Contacts.CONTENT_ITEM_TYPE
, ale nie ustawiaj identyfikatora URI danych.
Gdy wyślesz tę intencję, aplikacja do obsługi kontaktów wyświetli listę kontaktów.
Użytkownicy mogą wstawić nowy kontakt lub wybrać istniejący i edytować go.
Wszystkie rozszerzone pola danych, które dodasz do intencji, wypełnią wyświetlony ekran. Możesz użyć dowolnej pary klucz-wartość określonej w Intents.Insert
. Ten fragment kodu pokazuje, jak utworzyć i wysł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);