Menerima/Menangkap Hasil dari 'Activity'

Memanggil 'activity' yang lain tidaklah selalu satu arah. Kita juga bisa memanggil 'activity' yang lain tersebut dan menerima hasilnya kembali. Untuk menerima hasilnya, kita memanggil 'startActivityForResult()' (sebagai pengganti 'startActivity()').

Contohnya, app kita bisa memanggil app camera dan mendapat photo yang diambil kamera sebagai hasilnya. Atau kita mungkin memanggil app People secara berurutan supaya user bisa memilih contact dan kita bisa menerima detil-detil contact sebagai hasilnya.

Tentu 'activity' yang akan dipanggil dan merespon harus di-desain untuk mengembalikan hasilnya. Ketika 'activity' tersebut merespon, dia akan mengirim hasilnya sebagai object 'Intent' yang lain. 'Activity' kita menerimanya di dalam method 'onActivityResult()'.
Catatan:
Kita bisa menggunakan 'intent-intent' explisit maupun implisit ketika kita memanggil 'startActivityForResult()'. Ketika memulai salah satu 'activities' kita untuk menerima suatu hasil, kita seharusnya menggunakan 'intent' explisit untuk memastikan bahwa kita menerima hasil yang diharapkan.

Memulai 'Activity'

Tidak ada yang istimewa dengan object 'Intent' yang kita gunakan ketika memulai suatu 'activity' untuk mendapatkan hasil yang dikembalikan, tetapi kita benar-benar perlu melewatkan argument integer tambahan pada method 'startActivityForResult()'.

Argument integer tersebut adalah suatu "kode request' yang mengidentifikasi request kita. Ketika kita menerima hasil 'Intent', method tersebut akan memberikan kode request yang sama sehingga app kita bisa mengidentifikasi dengan tepat dan menentukan bagaimana menanganinya..

Contohnya, berikut di bawah ini adalah bagaimana memulai suatu 'activity' yang mengijinkan user untuk memilih suatu kontak:

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

Ketika user sudah selesai dengan 'activity' berikutnya dan kembali lagi, sistem akan memanggil method 'onActivityResult()' dari 'activity' kita. Method ini memiliki tiga argument:
Contohnya, berikut di bawah ini adalah bagaimana kita bisa menangani hasil untuk 'intent' yang dimaksudkan untuk memilih kontak:

@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/dihasilkan oleh 'Contacts di Android' atau app 'People' menyediakan suatu kontent 'Uri' yang mengidentifikasi kontak yang dipilih user.

Supaya berhasil menangani hasil tersebut, kita harus memahami format apa yang akan dihasilkan oleh 'Intent'. Ini akan mudah bila 'activity' yang mengembalikan/menghasilkan suatu hasil adalah salah satu dari 'activity' kita sendiri. App yang merupakan bawaan platform Android akan menawarkankan API-API mereka sendiri yang bisa kita gunakan untuk mendapatkan hasil tertentu. Contohnya, app 'People' akan selalu mengembalikan/menghasilkan hasil dengan konten 'URI' yang memberikan kontak yang dipilih, dan app 'Camera' akan mengembalikan/mengembalikan 'Bitmap' di data extra (coba baca latihan tentang 'Capturing Photos').

Bonus: Membaca data kontak

Kode di atas yang menunjukkan bagaimana mendapatkan hasil dari app 'People' tidak membahas detil-detil tentang bagaimana sesungguhnya membaca data dari hasil tersebut, karena hal itu memerlukan bahasan tingkat lanjut tentang 'content providers'. Tetapi bila penasaran dan ingin tahu, berikut di bawah ini adalah beberapa kode yang lebih banyak untuk menunjukkan bagaimana melakukan query terhadap data hasil untuk mendapatkan nomor phone dari kontak yang dipilih:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // 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 = data.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 CursorLoader 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), ketika melakukan query pada 'Contacts Provider' (seperti kode di atas) memerlukan bahwa app kita membuat permission untuk 'READ_CONTACTS' (silahkan baca 'Security and Permissions'). Tetapi, mulai Android 2.3, app 'Contacts/People' memberikan permission sementara untuk membaca dari 'Contacts Provider' ketika mengembalikan/menghasilkan suatu hasil. Permission sementara ini berlaku hanya pada kontak tertentu yang diminta, jadi kita tidak bisa melakukan query ke suatu kontak selain yang sudah ditentukan oleh 'Uri' dari 'intent', kecuali jika kita membuat permission 'READ_CONTACTS'.

license: cc by 

No comments: