Этот вопрос первоначально задали для Android 1.6.
Я работаю над фото опциями в своем приложении.
У меня есть кнопка и ImageView в моем Действии. Когда я нажимаю кнопку, она перенаправила бы в галерею, и я смогу выбрать изображение. Выбранное изображение появилось бы в моем ImageView.
Обновленный ответ, почти 5 лет спустя:
Код в оригинальном ответе больше не работает надежно, поскольку изображения из различных источников иногда возвращаются с другим URI содержимого, т.е. content://
, а не file://
. Лучшим решением будет просто использовать context.getContentResolver().openInputStream(intent.getData())
, так как это вернет InputStream, который вы можете обрабатывать по своему усмотрению.
Например, BitmapFactory.decodeStream()
отлично работает в этой ситуации, поскольку вы также можете использовать опции и поле 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
. Он просто получает номер столбца на основе его имени, того же самого, которое используется в процессе фильтрации. Получив это, вы наконец-то сможете декодировать изображение в растровую карту с помощью последней строки кода, которую я привел.
Сделайте это, чтобы запустить галерею и позволить пользователю выбрать изображение:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);
Затем в вашем onActivityResult ()
используйте URI изображения, возвращаемого для установки изображения в ImageView.
Для получения результата необходимо запустить намерение галереи.
Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
Затем в onActivityForResult
вызовите intent.getData ()
, чтобы получить Uri изображения. Затем вам нужно получить изображение из ContentProvider.