Jawaban yang diperbarui, hampir 5 tahun kemudian:
Kode dalam jawaban asli tidak lagi dapat diandalkan, karena gambar dari berbagai sumber terkadang kembali dengan URI konten yang berbeda, yaitu content://
alih-alih file://
. Solusi yang lebih baik adalah dengan hanya menggunakan context.getContentResolver().openInputStream(intent.getData())
, karena itu akan mengembalikan InputStream yang dapat Anda tangani sesuai pilihan Anda.
Misalnya, BitmapFactory.decodeStream()
berfungsi dengan baik dalam situasi ini, karena Anda juga dapat menggunakan bidang Options dan inSampleSize untuk memperkecil gambar besar dan menghindari masalah memori.
Namun, hal-hal seperti Google Drive mengembalikan URI ke gambar yang sebenarnya belum diunduh. Karenanya Anda perlu menjalankan kode getContentResolver () pada utas latar belakang.
Jawaban asli:
Jawaban lain menjelaskan cara mengirim maksud, tetapi mereka tidak menjelaskan dengan baik bagaimana menangani respons. Berikut ini beberapa contoh kode tentang cara melakukannya:
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(
selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
}
}
}
Setelah ini, Anda memiliki gambar yang dipilih disimpan di "yourSelectedImage" untuk melakukan apa pun yang Anda inginkan. Kode ini berfungsi dengan mendapatkan lokasi gambar di basis data ContentResolver, tetapi itu saja tidak cukup. Setiap gambar memiliki sekitar 18 kolom informasi, mulai dari filepath hingga 'tanggal terakhir dimodifikasi' hingga koordinat GPS tempat foto diambil, meskipun banyak bidang yang sebenarnya tidak digunakan.
Untuk menghemat waktu karena Anda sebenarnya tidak membutuhkan bidang lain, pencarian kursor dilakukan dengan filter. Filter bekerja dengan menentukan nama kolom yang Anda inginkan, MediaStore.Images.Media.DATA, yang merupakan path, dan kemudian memberikan string [] ke kueri kursor. Kueri kursor kembali dengan jalur, tetapi Anda tidak tahu di kolom mana itu sampai Anda menggunakan columnIndex
kode. Itu hanya mendapatkan nomor kolom berdasarkan namanya, yang sama digunakan dalam proses penyaringan. Setelah Anda mendapatkannya, Anda akhirnya dapat mendekode gambar menjadi bitmap dengan baris kode terakhir yang saya berikan.