Pelajaran ini menunjukkan cara menggunakan Intent untuk menyisipkan kontak baru atau
    mengubah data kontak. Alih-alih mengakses Penyedia Kontak secara langsung,
    Intent memulai aplikasi kontak, yang menjalankan
    Activity yang sesuai. Untuk tindakan modifikasi yang dijelaskan dalam pelajaran ini,
    jika Anda mengirim data yang diperluas di Intent, data itu akan dimasukkan ke dalam UI
    Activity yang dimulai.
    Sebaiknya gunakan Intent untuk menyisipkan atau memperbarui satu kontak
    modifikasi Penyedia Kontak, karena alasan berikut:
- Menghemat waktu dan upaya untuk mengembangkan UI dan kode Anda sendiri.
- Menghindari error yang disebabkan oleh modifikasi yang tidak mengikuti Aturan Penyedia Kontak.
- Hal ini mengurangi jumlah izin yang perlu Anda minta. Aplikasi Anda tidak memerlukan izin menulis ke Penyedia Kontak, karena mendelegasikan modifikasi ke aplikasi kontak, yang sudah memiliki izin tersebut.
Menyisipkan kontak baru menggunakan intent
Terkadang Anda mungkin ingin mengizinkan pengguna menyisipkan kontak baru saat aplikasi Anda menerima data baru. Misalnya, aplikasi ulasan restoran dapat mengizinkan pengguna untuk menambahkan restoran sebagai kontak selagi mereka mengulasnya. Untuk melakukan ini menggunakan intent, buat intent menggunakan sebanyak mungkin data yang tersedia, lalu kirim intent ke aplikasi kontak.
    Menyisipkan kontak menggunakan aplikasi kontak akan menyisipkan kontak mentah baru ke dalam tabel ContactsContract.RawContacts
    Penyedia Kontak.  Jika perlu,
    aplikasi kontak akan meminta pengguna untuk memasukkan jenis akun dan akun yang akan digunakan saat membuat kontak
    mentah. Aplikasi kontak juga memberi tahu pengguna jika kontak mentah sudah ada. Selanjutnya, pengguna memiliki
    opsi untuk membatalkan penyisipan, yang dalam hal ini tidak ada kontak yang dibuat. Untuk mempelajari
    selengkapnya tentang kontak mentah, lihat
    Penyedia Kontak
    Panduan API.
Membuat intent
    Untuk memulai, buat objek Intent baru dengan tindakan
    Intents.Insert.ACTION.
    Tetapkan jenis MIME ke RawContacts.CONTENT_TYPE. Contoh:
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);
    Jika sudah memiliki detail untuk kontak, seperti nomor telepon atau alamat email, Anda dapat
    menyisipkannya ke dalam intent sebagai data yang diperluas. Untuk nilai kunci, gunakan konstanta yang sesuai dari
    Intents.Insert. Aplikasi kontak
    menampilkan data di layar sisipannya, yang memungkinkan pengguna melakukan pengeditan dan penambahan lebih lanjut.
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);
    Setelah Anda membuat Intent, kirimkan dengan memanggil
    startActivity().
Kotlin
/* Sends the Intent */ startActivity(intent)
Java
/* Sends the Intent */ startActivity(intent);
Panggilan ini membuka layar di aplikasi kontak yang memungkinkan pengguna memasukkan kontak baru. Tujuan jenis akun dan nama akun untuk kontak tercantum di bagian atas layar. Setelah pengguna memasukkan data dan mengklik Selesai, daftar kontak aplikasi kontak akan muncul. Pengguna kembali ke aplikasi Anda dengan mengklik Kembali.
Mengedit kontak yang ada menggunakan intent
    Mengedit kontak yang ada menggunakan Intent berguna jika pengguna
    telah memilih kontak yang diminati. Misalnya, aplikasi yang menemukan kontak yang memiliki alamat pos, tetapi tidak memiliki kode pos, dapat memberi pengguna opsi untuk mencari kode tersebut, lalu menambahkannya ke kontak.
    Untuk mengedit kontak yang ada menggunakan intent, gunakan prosedur yang mirip dengan
    menyisipkan kontak. Membuat intent seperti yang dijelaskan dalam bagian
    Menyisipkan kontak baru menggunakan intent, tetapi menambahkan informasi kontak
    Contacts.CONTENT_LOOKUP_URI dan jenis MIME
    Contacts.CONTENT_ITEM_TYPE ke intent. Jika Anda ingin mengedit kontak dengan detail yang
    miliki, Anda bisa memasukkannya ke dalam data intent yang diperluas. Perhatikan bahwa beberapa
    kolom nama tidak dapat diedit menggunakan intent; kolom ini tercantum di ringkasan
    referensi API untuk class ContactsContract.Contacts
    dengan judul "Perbarui".
Terakhir, kirimkan intent. Sebagai respons, aplikasi kontak akan menampilkan layar edit. Saat pengguna selesai mengedit dan menyimpan hasil edit, aplikasi kontak akan menampilkan daftar kontak. Saat pengguna mengklik Kembali, aplikasi Anda akan ditampilkan.
Membuat intent
    Untuk mengedit kontak, panggil Intent(action) untuk
    buat intent dengan tindakan ACTION_EDIT. Telepon
    setDataAndType() untuk menetapkan nilai data
    intent ke Contacts.CONTENT_LOOKUP_URI kontak dan jenis MIME untuk
    Contacts.CONTENT_ITEM_TYPE Jenis MIME; karena panggilan ke
    setType() menimpa nilai data saat ini untuk
    Intent, Anda harus menetapkan data dan jenis MIME secara bersamaan.
    Untuk mendapatkan Contacts.CONTENT_LOOKUP_URI kontak, panggil
    Contacts.getLookupUri(id, lookupkey) dengan nilai
    Contacts._ID dan
    Contacts.LOOKUP_KEY kontak sebagai
    argumen.
Catatan: Nilai
LOOKUP_KEY kontak adalah
        ID yang harus Anda gunakan untuk mengambil kontak. Nilainya tetap konstan,
        bahkan jika penyedia mengubah ID baris kontak untuk menangani operasi internal.
Cuplikan berikut menunjukkan cara membuat intent:
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);
Menambahkan flag navigasi
Di Android 4.0 (API versi 14) dan yang lebih baru, masalah dalam aplikasi kontak menyebabkan kesalahan navigasi. Saat aplikasi Anda mengirimkan intent edit ke aplikasi kontak, dan pengguna mengedit serta menyimpan kontak, saat mengklik Kembali, mereka akan melihat layar daftar kontak. Untuk kembali ke aplikasi Anda, mereka harus mengklik Terbaru dan memilih aplikasi Anda.
    Untuk mengatasi masalah ini di Android 4.0.3 (API versi 15) dan yang lebih baru, tambahkan kunci data yang diperluas
    finishActivityOnSaveCompleted ke intent, dengan nilai true.
    Versi Android sebelum 4.0 menerima kunci ini, tetapi tidak berpengaruh. Untuk menyetel
    data yang diperluas, lakukan langkah berikut:
Kotlin
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true)
Java
// Sets the special extended data for navigation editIntent.putExtra("finishActivityOnSaveCompleted", true);
Menambahkan data yang diperluas lainnya
    Untuk menambahkan data yang diperluas lainnya ke Intent, panggil
    putExtra() seperti yang diinginkan.
    Anda dapat menambahkan data yang diperluas untuk kolom kontak umum menggunakan nilai kunci yang ditetapkan dalam
    Intents.Insert. Ingat bahwa beberapa
    kolom dalam tabel ContactsContract.Contacts tidak dapat diubah.
    Kolom ini dicantumkan di bagian ringkasan referensi API untuk class
    ContactsContract.Contacts di bawah judul "Perbarui".
Mengirim intent
Terakhir, kirimkan intent yang telah Anda buat. Contoh:
Kotlin
// Sends the Intent startActivity(editIntent)
Java
// Sends the Intent startActivity(editIntent);
Mengizinkan pengguna memilih untuk menyisipkan atau mengedit menggunakan intent
    Anda dapat mengizinkan pengguna memilih untuk menyisipkan kontak atau mengedit yang sudah ada dengan mengirim
    Intent dengan tindakan
    ACTION_INSERT_OR_EDIT. Misalnya, aplikasi program email dapat
    mengizinkan pengguna menambahkan alamat email masuk ke kontak baru, atau menambahkannya sebagai alamat
    tambahan untuk kontak yang sudah ada. Tetapkan jenis MIME untuk intent ini ke
    Halo Contacts.CONTENT_ITEM_TYPE,
    tetapi jangan tetapkan URI data.
    Saat Anda mengirim intent ini, aplikasi kontak akan menampilkan daftar kontak.
    Pengguna dapat menyisipkan kontak baru atau memilih kontak yang ada dan mengeditnya.
    Setiap kolom data yang diperluas yang Anda tambahkan ke intent akan mengisi layar yang muncul. Anda dapat menggunakan salah satu nilai kunci yang ditentukan di Intents.Insert. Cuplikan kode berikut menunjukkan cara membuat dan mengirim intent:
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);
