Z tej lekcji dowiesz się, jak za pomocą Intent
wstawić nowy kontakt lub
modyfikować dane kontaktu. 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 wysiłek związany z opracowywaniem własnego interfejsu użytkownika i kodu.
- Dzięki temu można uniknąć błędów spowodowanych modyfikacjami, które nie są zgodne z zasadami dostawcy kontaktów.
- Zmniejsza to liczbę uprawnień, o które musisz poprosić. Aplikacja nie potrzebuje uprawnienia do zapisu w usługach kontaktów, ponieważ deleguje zmiany do aplikacji kontaktów, która już ma to uprawnienie.
Wstaw nowy kontakt za pomocą intencji
Często możesz chcieć zezwolić użytkownikowi na wstawienie nowego kontaktu, gdy aplikacja otrzyma nowe dane. Dla: Aplikacja z recenzjami restauracji może na przykład pozwalać użytkownikom na dodawanie restauracji do kontaktów go sprawdzić. Aby to zrobić za pomocą intencjonalnego działania, utwórz intencjonalne działanie, korzystając z jak największej ilości dostępnych danych, a potem prześlij je do aplikacji Kontakty.
Wstawianie kontaktu za pomocą aplikacji Kontakty powoduje dodanie nowego surowego kontaktu do tabeli ContactsContract.RawContacts
dostawcy Kontaktów. W razie potrzeby:
aplikacja Kontakty prosi użytkowników o podanie typu konta i konta, które mają być używane podczas tworzenia
kontakt. Aplikacja Kontakty powiadamia też użytkowników, jeśli nieprzetworzony kontakt już istnieje. Użytkownicy mają
anulować dodawanie kontaktów, co oznacza, że nie jest tworzone żadne kontakty. 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 dalsze ich edytowanie i uzupełnianie.
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ą wymienione 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ą Intent
jest przydatne, jeśli użytkownik wybrał już kontakt, który go interesuje. Na przykład aplikacja, która wyszukuje kontakty mające adresy pocztowe, ale bez kodu pocztowego, może dać użytkownikom możliwość wyszukania kodu i dodania 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, korzystając z dostępnych już danych, możesz umieścić je 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 wyślij intencję. W odpowiedzi na to aplikacja Kontakty wyświetla ekran edycji. Gdy użytkownik zakończy edytowanie i zapisze zmiany, aplikacja Kontakty wyświetli listę kontaktów. Gdy użytkownik kliknie Wstecz, wyświetli się Twoja aplikacja.
Tworzenie intencji
Aby edytować kontakt, wywołaj funkcję Intent(action)
, aby utworzyć intencję z działaniem ACTION_EDIT
. Wywołaj funkcję setDataAndType()
, aby ustawić wartość danych dla zamiaru na Contacts.CONTENT_LOOKUP_URI
kontaktującego się użytkownika i typ MIME na Contacts.CONTENT_ITEM_TYPE
. Ponieważ wywołanie funkcji setType()
zastępuje bieżącą wartość danych dla Intent
, musisz ustawić dane i typ MIME w tym samym czasie.
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: nazwa kontaktu
Aktualna wartość LOOKUP_KEY
oraz 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);
Dodaj flagę nawigacji
W Androidzie 4.0 (interfejs API w wersji 14) i nowszych występuje problem z aplikacją Kontakty, który powoduje nieprawidłową nawigację. 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, użytkownik musi kliknąć Ostatnie i wybrać ją.
Aby obejść ten problem w Androidzie 4.0.3 (wersja interfejsu API 15) i nowszych, dodaj rozszerzony
klucz danych finishActivityOnSaveCompleted
do intencji z wartością true
.
Wersje Androida starsze niż 4.0 akceptują ten klucz, ale nie ma on żadnego wpływu. Aby ustawić rozszerzone dane:
Kotlin
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true)
Java
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true);
Dodaj inne rozszerzone dane
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órych kolumn w tabeli ContactsContract.Contacts
nie można modyfikować.
Te kolumny są wymienione w sekcji podsumowania w dokumentacji interfejsu API danej klasy
ContactsContract.Contacts
pod nagłówkiem „Aktualizuj”.
Wyślij intencję
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 wstawienie lub edytowanie istniejącego kontaktu przez wysyłanie
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 ten zamiar, aplikacja Kontakty wyświetli listę kontaktów.
Użytkownicy mogą wstawić nowy kontakt lub wybrać i zmodyfikować istniejący.
Wszystkie rozszerzone pola danych dodane do intencji wypełniają wyświetlony ekran. Możesz użyć dowolnej z wartości klucza określonych w pliku 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);