Обновленный ответ, почти 5 лет спустя:
код в оригинальный ответ больше не работает надежно, как и образы из различных источников, иногда возвращаются с различным содержанием URI, т.е. content://
, а не file://
. Лучшее решение - просто использовать context.getContentResolver().openInputStream(intent.getData())
, так как это вернет InputStream, который вы сможете обрабатывать по своему усмотрению.
Например, BitmapFactory.decodeStream()
отлично справляется с этой ситуацией, так как вы также можете использовать поля «Параметры» и «Иссечение размера» для уменьшения размера больших изображений и устранения проблем с памятью.
Однако такие вещи, как 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
. Это просто получает номер столбца на основе его имени, тот же самый, который используется в процессе фильтрации. Как только вы получите это, вы, наконец, сможете декодировать изображение в растровое изображение с последней строкой кода, которую я дал.
посмотреть на этот ответ, я разместил улучшенный код там обрабатывать медиаторы из файловых менеджеров также http://stackoverflow.com/questions/2169649/open-an-image-in-androids-built-in- gallery-app-programatically/4470069 # 4470069 – mad