Этот вопрос изначально задавался для Android 1.6.
Я работаю над опциями фотографий в моем приложении.
У меня есть кнопка и ImageView в моей деятельности. Когда я нажимаю кнопку, она перенаправляется в галерею, и я могу выбрать изображение. Выбранное изображение появится в моем ImageView.
android
android-image
android-gallery
Praveen
источник
источник
Ответы:
Обновленный ответ, почти через 5 лет:
Нет кода в оригинальный ответ больше не работает надежно, как и образы из различных источников , иногда возвращаются с различным содержанием URI, то есть
content://
, чемfile://
. Лучшее решение - просто использоватьcontext.getContentResolver().openInputStream(intent.getData())
, так как это вернет InputStream, который вы можете обрабатывать по своему усмотрению.Например,
BitmapFactory.decodeStream()
в этой ситуации отлично работает, так как вы также можете использовать поля Options и inSampleSize, чтобы уменьшить размер больших изображений и избежать проблем с памятью.Однако такие вещи, как Google Drive, возвращают URI к изображениям, которые еще не были загружены. Поэтому вам нужно выполнить код getContentResolver () в фоновом потоке.
Оригинальный ответ:
Другие ответы объяснили, как отправить намерение, но они не объяснили, как правильно обработать ответ. Вот пример кода о том, как это сделать:
После этого у вас есть выбранное изображение, хранящееся в «yourSelectedImage», чтобы делать с чем угодно. Этот код работает путем получения местоположения изображения в базе данных ContentResolver, но одного этого недостаточно. Каждое изображение содержит около 18 столбцов информации, начиная от пути к файлу до «даты последнего изменения» и заканчивая GPS-координатами, где была сделана фотография, хотя многие поля фактически не используются.
Чтобы сэкономить время, так как другие поля вам на самом деле не нужны, поиск курсора выполняется с помощью фильтра. Фильтр работает, указав имя нужного столбца MediaStore.Images.Media.DATA, которое является путем, и затем предоставив эту строку [] для запроса курсора. Запрос курсора возвращается с путем, но вы не знаете, в каком столбце он находится, пока не используете
columnIndex
код. Это просто получает номер столбца на основе его имени, тот же, который используется в процессе фильтрации. Получив это, вы наконец-то сможете декодировать изображение в растровое изображение с последней строкой кода, которую я дал.источник
Начать намерение
Результат процесса
Кроме того, вы можете также уменьшить изображение, чтобы избежать ошибок OutOfMemory.
источник
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Вы должны начать намерение галереи для результата.
Затем
onActivityForResult
позвоните,intent.getData()
чтобы получить Uri Изображения. Затем вам нужно получить изображение от ContentProvider.источник
Вот проверенный код для изображения и видео. Он будет работать для всех API менее 19 и более 19.
Образ:
Видео:
,
источник
Сделайте это, чтобы запустить галерею и позволить пользователю выбрать изображение:
Затем вы
onActivityResult()
используете URI изображения, которое возвращается, чтобы установить изображение в вашем ImageView.источник
источник
источник
По некоторым причинам все ответы в этой теме
onActivityResult()
пытаются пост-обработать полученноеUri
, например, получить реальный путь к изображению, а затем использоватьBitmapFactory.decodeFile(path)
для полученияBitmap
.Этот шаг не нужен. У
ImageView
класса есть метод с именемsetImageURI(uri)
. Передайте свой URI, и все должно быть сделано.Полный рабочий пример вы можете посмотреть здесь: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS:
Получение
Bitmap
в отдельной переменной имеет смысл в тех случаях, когда загружаемое изображение слишком велико, чтобы поместиться в память, и необходимо предотвратить операцию уменьшенияOurOfMemoryError
, как показано в ответе @siamii.источник
вызовите метод chooseImage как
источник
источник