Обновленный ответ, почти через 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
.Он просто получает номер столбца на основе его имени, тот же самый, который используется в процессе фильтрации.Получив это, вы наконец-то сможете декодировать изображение в растровое изображение с последней строкой кода, которую я дал.