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