The Android Developer Challenge is back! Submit your idea before December 2.

Mengubah kontak menggunakan intent

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.

Menggunakan Intent untuk menyisipkan atau memperbarui satu kontak adalah cara yang lebih disukai untuk memodifikasi Penyedia Kontak, karena alasan berikut:

  • Menghemat waktu dan upaya untuk mengembangkan UI dan kode Anda sendiri.
  • Menghindari error akibat modifikasi yang tidak mengikuti aturan Penyedia Kontak.
  • Mengurangi jumlah izin yang perlu Anda minta. Aplikasi Anda tidak perlu izin untuk menulis ke Penyedia Kontak karena sudah mendelegasikan modifikasi ke aplikasi kontak, yang sudah memiliki izin itu.

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 itu menggunakan intent, buatlah intent yang 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 kontak mentah lebih lanjut, lihat panduan API Penyedia Kontak.

Membuat intent

Untuk memulai, buatlah objek Intent baru dengan tindakan Intents.Insert.ACTION. Tetapkan jenis MIME ke RawContacts.CONTENT_TYPE. Misalnya:

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 akan menampilkan data di layar Sisipkan, yang memungkinkan pengguna untuk 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. Jenis akun dan nama akun untuk kontak dicantumkan 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 pos itu dan menambahkannya ke kontak.

Untuk mengedit kontak yang ada menggunakan intent, gunakan prosedur yang mirip dengan menyisipkan kontak. Buat intent seperti yang dijelaskan di bagian Menyisipkan kontak baru menggunakan intent, tetapi tambahkan Contacts.CONTENT_LOOKUP_URI kontak dan jenis MIME Contacts.CONTENT_ITEM_TYPE ke intent. Jika ingin mengedit kontak dengan detail yang sudah Anda miliki, Anda dapat menempatkannya di data yang diperluas untuk intent tersebut. Perhatikan bahwa beberapa kolom nama tidak dapat diedit menggunakan intent; kolom tersebut tercantum di bagian ringkasan referensi API untuk class ContactsContract.Contacts dengan judul "Perbarui".

Terakhir, kirimkan intent. Sebagai respons, aplikasi kontak akan menampilkan layar edit. Setelah 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 membuat intent dengan tindakan ACTION_EDIT. Panggil setDataAndType() untuk menetapkan nilai data intent tersebut ke Contacts.CONTENT_LOOKUP_URI kontak dan jenis MIME ke Contacts.CONTENT_ITEM_TYPE. 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. ID ini selalu konstan, sekalipun 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

Pada 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, lalu pengguna mengedit dan menyimpan kontak, maka 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 pada 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 menetapkan 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 yang umum menggunakan nilai kunci yang ditetapkan dalam Intents.Insert. Ingatlah bahwa beberapa kolom dalam tabel ContactsContract.Contacts tidak dapat diubah. Kolom ini dicantumkan di bagian ringkasan referensi API untuk class ContactsContract.Contacts dengan 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 untuk memilih apakah mereka akan menyisipkan kontak atau mengedit kontak yang sudah ada dengan mengirimkan Intent bersama tindakan ACTION_INSERT_OR_EDIT. Misalnya, aplikasi program email dapat mengizinkan pengguna untuk menambahkan alamat email masuk ke kontak baru, atau menambahkannya sebagai alamat tambahan untuk kontak yang sudah ada. Tetapkan jenis MIME untuk intent ini ke 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 ditetapkan 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);