Оновлена відповідь, майже через 5 років:
Код в оригінальній відповіді більше не працює надійно, оскільки зображення з різних джерел іноді повертаються з іншим вмістом URI, тобто content://
, ніж file://
. Кращим рішенням буде просто використовувати context.getContentResolver().openInputStream(intent.getData())
, оскільки це поверне InputStream, з яким ви можете обробляти за своїм бажанням.
Наприклад, BitmapFactory.decodeStream()
прекрасно працює в цій ситуації, оскільки ви також можете використовувати поле Options і inSampleSize для зменшення вибірки великих зображень та уникнення проблем із пам'яттю.
Однак такі речі, як Google Drive, повертають URI на зображення, які ще не завантажені. Тому вам потрібно виконати код getContentResolver () у фоновому потоці.
Оригінальна відповідь:
В інших відповідях було пояснено, як надіслати намір, але вони не пояснили, як поводитися з відповіддю. Ось приклад коду про те, як це зробити:
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);
}
}
}
Після цього у вас вибране зображення зберігається у "yourSelectedImage", щоб робити все, що завгодно. Цей код працює, отримуючи розташування зображення в базі даних ContentResolver, але самостійно цього недостатньо. Кожне зображення містить близько 18 стовпців інформації, починаючи з його файлового тракту і закінчуючи "датою останньої зміни" до координат GPS, де зроблено фото, хоча багато з полів насправді не використовуються.
Щоб заощадити час, оскільки фактично вам не потрібні інші поля, пошук курсору проводиться за допомогою фільтра. Фільтр працює, вказуючи назву потрібного стовпця, MediaStore.Images.Media.DATA, який є шляхом, а потім надає цей рядок [] запиту курсора. Запит курсору повертається разом із контуром, але ви не знаєте, у якому стовпчику знаходиться, поки не використаєте columnIndex
код. Це просто отримує номер стовпця на основі його імені, того самого, який використовується у процесі фільтрації. Як тільки ви це отримаєте, ви, нарешті, зможете розшифрувати зображення в растровій карті з останнім рядком коду, який я дав.