Register now for Android Dev Summit 2019!

Mendapatkan Hasil dari Activity

Memulai aktivitas lain tidak harus satu arah. Anda juga dapat memulai aktivitas lain dan kembali menerima hasilnya. Untuk menerima hasil, panggil startActivityForResult() (bukan startActivity()).

Misalnya, aplikasi Anda dapat memulai aplikasi kamera dan sebagai hasilnya menerima foto yang diambil. Atau, Anda dapat memulai aplikasi People agar pengguna dapat memilih kontak dan sebagai hasilnya, Anda akan menerima detail kontak.

Tentu saja, aktivitas yang merespons harus dirancang untuk mengembalikan suatu hasil. Jika sudah dirancang demikian, aktivitas akan mengirimkan hasilnya sebagai objek Intent lainnya. Aktivitas Anda menerimanya dalam callback onActivityResult().

Catatan: Anda dapat menggunakan intent eksplisit atau implisit saat Anda menelepon startActivityForResult(). Saat memulai salah satu aktivitas Anda sendiri untuk menerima hasil, Anda harus menggunakan maksud eksplisit guna memastikan Anda menerima hasil yang diharapkan.

Memulai Activity

Tidak ada yang khusus pada objek Intent yang Anda gunakan saat memulai aktivitas untuk mendapatkan suatu hasil, namun Anda perlu meneruskan argumen integer tambahan ke metode startActivityForResult().

Argumen integer adalah “kode permintaan” yang mengidentifikasi permintaan Anda. Saat Anda menerima hasil Intent, callback akan memberikan kode permintaan yang sama sehingga aplikasi Anda bisa mengidentifikasi hasilnya dengan benar dan menentukan cara menanganinya.

Misalnya, inilah cara memulai aktivitas yang memungkinkan pengguna mengambil sebuah kontak:

Kotlin

const val PICK_CONTACT_REQUEST = 1  // The request code
...
private fun pickContact() {
    Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")).also { pickContactIntent ->
        pickContactIntent.type = Phone.CONTENT_TYPE // Show user only contacts w/ phone numbers
        startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST)
    }
}

Java

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

Menerima Hasilnya

Bila pengguna selesai dengan aktivitas selanjutnya dan kembali, sistem akan memanggil metodeonActivityResult() aktivitas Anda. Metode ini mencakup tiga argumen:

  • Kode permintaan yang Anda teruskan ke startActivityForResult().
  • Kode hasil yang ditetapkan oleh aktivitas kedua. Hasilnya bisa berupa RESULT_OK jika operasinya berhasil atau RESULT_CANCELED jika pengguna menarik diri atau operasinya gagal karena suatu alasan.
  • Suatu Intent yang membawa data hasil.

Misalnya, inilah cara Anda bisa menangani hasil untuk intent “pilih kontak”:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

Dalam contoh ini, hasil Intent yang dikembalikan oleh Aplikasi Orang atau Kontak Android memberikan Uri materi yang mengidentifikasi kontak pilihan pengguna.

Agar berhasil menangani hasilnya, Anda harus memahami format hasil Intent nanti. Mudah melakukannya bila aktivitas yang mengembalikan hasil adalah salah satu aktivitas Anda sendiri. Aplikasi yang disertakan bersama platform Android menawarkan API sendiri yangbisa Anda andalkan untuk data hasil tertentu. Misalnya, Aplikasi Orang selalu mengembalikan hasil bersama URI materi yang mengidentifikasi kontak yang dipilih, dan aplikasi Kamera mengembalikan Bitmap dalam ekstra "data" (lihat kelas tentang Menjepret Foto).

Bonus: Membaca data kontak

Kode di atas yang menampilkan cara mendapatkan hasil dari Aplikasi Orang tidak memberikan detail tentang bagaimana sebenarnya membaca data dari hasil, karena hal itu memerlukan pembahasan lebih jauh tentang penyedia materi. Akan tetapi, jika Anda ingin tahu, inilah beberapa kode lainnya yang menampilkan cara kueri data hasil untuk mendapatkan nomor ponsel dari kontak yang dipilih:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK) {
            // We only need the NUMBER column, because there will be only one row in the result
            val projection: Array<String> = arrayOf(Phone.NUMBER)

            // Get the URI that points to the selected contact
            data.data?.also { contactUri ->
                // Perform the query on the contact to get the NUMBER column
                // We don't need a selection or sort order (there's only one result for this URI)
                // CAUTION: The query() method should be called from a separate thread to avoid
                // blocking your app's UI thread. (For simplicity of the sample, this code doesn't
                // do that.)
                // Consider using <code><a href="/reference/android/content/CursorLoader.html">CursorLoader</a></code> to perform the query.
                contentResolver.query(contactUri, projection, null, null, null)?.apply {
                    moveToFirst()

                    // Retrieve the phone number from the NUMBER column
                    val column: Int = getColumnIndex(Phone.NUMBER)
                    val number: String? = getString(column)

                    // Do something with the phone number...
                }
            }
        }
    }
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact
            Uri contactUri = resultIntent.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            String[] projection = {Phone.NUMBER};

            // Perform the query on the contact to get the NUMBER column
            // We don't need a selection or sort order (there's only one result for the given URI)
            // CAUTION: The query() method should be called from a separate thread to avoid blocking
            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
            // Consider using <code><a href="/reference/android/content/CursorLoader.html">CursorLoader</a></code> to perform the query.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Retrieve the phone number from the NUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // Do something with the phone number...
        }
    }
}

Catatan: Sebelum Android 2.3 (API level 9), melakukan kueripada Contacts Provider (seperti yang ditampilkan di atas) mengharuskan aplikasi mendeklarasikan izin READ_CONTACTS (lihat Keamanan dan Izin). Akan tetapi, mulai dengan Android 2.3, Aplikasi Orang/Kontak memberi izin sementara pada aplikasi Anda untuk membaca dari Penyedia Kontak bila aplikasi mengembalikan hasil kepada Anda. Izin sementara ini berlaku hanya untuk kontak tertentu yang diminta, sehingga Anda tidak bisa melakukan kueri kontak selain yang ditetapkan oleh Uri intent, kecuali jika Anda mendeklarasikan izin READ_CONTACTS.

Untuk informasi tambahan tentang topik di halaman ini, lihat resource berikut: