Как выбрать изображение из галереи (SD-карта) для моего приложения?

Этот вопрос первоначально задали для Android 1.6.

Я работаю над фото опциями в своем приложении.

У меня есть кнопка и ImageView в моем Действии. Когда я нажимаю кнопку, она перенаправила бы в галерею, и я смогу выбрать изображение. Выбранное изображение появилось бы в моем ImageView.

341
задан W4R10CK 2 February 2017 в 22:45
поделиться

3 ответа

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

415
ответ дан 23 November 2019 в 00:35
поделиться

Сделайте это, чтобы запустить галерею и позволить пользователю выбрать изображение:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);

Затем в вашем onActivityResult () используйте URI изображения, возвращаемого для установки изображения в ImageView.

14
ответ дан 23 November 2019 в 00:35
поделиться

Для получения результата необходимо запустить намерение галереи.

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.

87
ответ дан 23 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: