Android выбрать изображения из галереи


197

Я хочу создать картинку из галереи. Я использую код

 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(intent, TFRequestCodes.GALLERY);

Моя проблема в том, что в этом упражнении и видео файлы отображаются. Есть ли способ отфильтровать отображаемые файлы, чтобы в этом упражнении не отображались видеофайлы?


3
В этой статье подробно описывается, как выбирать изображения из галереи: androidbitmaps.blogspot.com/2015/04/…
Andy Res

Есть один похожий вопрос, как ты. stackoverflow.com/a/31382240/1835650
TeeTracker

Ответы:


347

Абсолютно. Попробуй это:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

Не забудьте также создать константу PICK_IMAGE , чтобы вы могли распознать, когда пользователь возвращается из галереи изображений.

public static final int PICK_IMAGE = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == PICK_IMAGE) {
        //TODO: action
    }
}

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

РЕДАКТИРОВАТЬ:

Это вызывает приложение Документы. Чтобы позволить пользователю также использовать любые приложения галереи, которые он мог установить:

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    getIntent.setType("image/*");

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, PICK_IMAGE);

6
Я получаю 2 варианта на эту «Система Android», «Документы». Если я выбираю Android System, то он представляет мне галерею и фотографии. Как мне избавиться от этого списка промежуточных опций?
Uday

4
@ Сегодня это просто потому, что вы не установили значение по умолчанию. Просто оставь это :)
Тристан Уайли

13
На что должна быть установлена ​​константа PICK_IMAGE? Там написано: «Не удается разрешить символ« PICK_IMAGE »
Майкл

3
@Michael Константа PICK_IMAGE содержит любое статическое значение int, определенное вами в этом самом классе, и далее оно используется в @Overrideфункции onActivityResult(int requestCode, resultCode, Intent data), где рекомендуется использовать эту константу для проверки requestCodeпараметра перед выполнением каких-либо действий :)
Габриэль Чеккиа Виталий

Вы можете получить растровое изображение из метода onActivityResult (...) с помощью следующего кода (при условии RESULT_OK): Bitmap bitmap = data.getExtras (). GetParcelable ("data");
Shn_Android_Dev

197

Иногда вы не можете получить файл с выбранной вами фотографии. Это потому, что выбранный был от Google+, Drive, Dropbox или любого другого провайдера.

Лучшее решение - попросить систему выбрать контент через Intent.ACTION_GET_CONTENT и получить результат у поставщика контента.

Вы можете следовать приведенному ниже коду или посмотреть мою обновленную суть .

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

14
if(resultCode == Activity.RESULT_OK) {...}может использоваться для обнаружения успеха / отмены
Thamme Gowda

Как вы можете получить путь?
поставка

@ Доставить, я думаю, вы могли бы попробовать new File(data.getData()).getAbsolutePath()Просто предположение, я не пробовал
Кто-то где-то

1
Предупреждение об исключении FileNotFound от Android Studio во фрагменте в getActivity().getContentResolver().openInputStream(data.getData());.
Икбал

1
Это работает на определенных устройствах, в которых путь к файлу не возвращается. Однако я не вижу способа определить - как только у меня будет InputStream - как определить ориентацию изображения.
Кейси Перкинс

30
public void FromCamera() {

    Log.i("camera", "startCameraActivity()");
    File file = new File(path);
    Uri outputFileUri = Uri.fromFile(file);
    Intent intent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, 1);

}

public void FromCard() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 2);
}

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2 && resultCode == RESULT_OK
            && null != data) {

        Uri selectedImage = data.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 picturePath = cursor.getString(columnIndex);
        cursor.close();

        bitmap = BitmapFactory.decodeFile(picturePath);
        image.setImageBitmap(bitmap);

        if (bitmap != null) {
            ImageView rotate = (ImageView) findViewById(R.id.rotate);

        }

    } else {

        Log.i("SonaSys", "resultCode: " + resultCode);
        switch (resultCode) {
        case 0:
            Log.i("SonaSys", "User cancelled");
            break;
        case -1:
            onPhotoTaken();
            break;

        }

    }

}

protected void onPhotoTaken() {
    // Log message
    Log.i("SonaSys", "onPhotoTaken");
    taken = true;
    imgCapFlag = true;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    bitmap = BitmapFactory.decodeFile(path, options);
    image.setImageBitmap(bitmap);


}

Большое спасибо. Этот ответ помог мне загрузить изображение позже
Росарио Перейра Фернандес

Я предполагаю, что вы имеете в виду случай 1: вместо случая -1: в переключателе в OnActivityResult.
Матиас

я знаю, что это новый вопрос, но, почему мы сделали все это, чтобы получить путь к изображению, что тогда возвращает data.getData?
moumenShobakey

какова стоимость path? вFile file = new File(path);
Рави Вания

23

Вы можете использовать этот метод, чтобы выбрать изображение из галереи. Будут отображаться только изображения.

public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("scale", true);
    intent.putExtra("outputX", 256);
    intent.putExtra("outputY", 256);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
}

и переопределить onActivityResult как

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == 1) {
            final Bundle extras = data.getExtras();
            if (extras != null) {
                //Get image
                Bitmap newProfilePic = extras.getParcelable("data");
            }
        }
    }

2
@Abhishek ... где вы нашли список дополнений, разрешенных для намерения ACTION_PICK? Спасибо!
Джонни Ву

1
Пожалуйста, не забудьте добавить разрешения времени выполнения для READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE для API уровня 23 и выше. В противном случае вы не можете получить растровое изображение из галереи как не нулевое. См. Stackoverflow.com/a/35285667/3341089
Oguzhan

1
Вызов setType после установки URI очистит данные.
Таслим Осени

11

Вот полный пример разрешения запроса (если нужно), выберите изображение из галереи, затем преобразуйте изображение в bitmapилиfile

AndroidManifesh.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Деятельность

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

демонстрация
https://github.com/PhanVanLinh/AndroidPickImage


Это не что иное, как библиотека, особенно с этой функцией кадрирования и соотношения сторон. Я никогда не знал, что такая вещь существует. Большое спасибо, сэр.
Лалит Фауздар

1
Здесь все не так хорошо, как я надеялся увидеть первые впечатления. Он не выбирает изображение при редактировании с помощью snapseed, без сбоев, но без изображения, приложение галереи huawei по умолчанию ничего не делает, когда я нажимаю «Далее» после редактирования, оно не редактирует изображение при выборе из фотографий Google, возвращает его без этого напрямую. Это работает хорошо, только если я выберу галерею huawei по умолчанию и фотографии Google для ее редактирования.
Лалит Фауздар

2

Если вы ищете только изображения и множественный выбор.

Посмотрите @ один раз https://stackoverflow.com/a/15029515/1136023

Это полезно для будущего. Я лично чувствую себя прекрасно, используя MultipleImagePick .


Какой самый быстрый способ использовать MultipleImagePick в качестве библиотеки? Он поставляется как отдельный проект / приложение.
ticofab

2

Просто предложить обновление ответа для людей с API мин. 19, согласно документам:

В Android 4.4 (уровень API 19) и выше у вас есть дополнительная возможность использовать намерение ACTION_OPEN_DOCUMENT, которое отображает управляемый системой пользовательский интерфейс средства выбора, позволяющий пользователю просматривать все файлы, которые другие приложения сделали доступными. Из этого единого пользовательского интерфейса пользователь может выбрать файл из любого из поддерживаемых приложений.

В Android 5.0 (уровень API 21) и выше вы также можете использовать намерение ACTION_OPEN_DOCUMENT_TREE, которое позволяет пользователю выбрать каталог для клиентского приложения для доступа.

Открывайте файлы, используя структуру доступа к хранилищу - Android Docs

     val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
     intent.type = "image/*"
     startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)

0

Только для выбора из местного добавить это:

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

И это работает здорово:

    val i = Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    i.type = "image/*"
    i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)
    startActivityForResult(Intent.createChooser(i,"Select Photo"),pickImageRequestCode)

-7

Вы можете сделать это проще, чем этот ответ:

Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);

Я делаю это, и это сработало. если вам нужно использовать файл, например, для отправки на сервер, вам нужно использовать другие способы, но только для загрузки изображения в imageview, вы можете сделать это простое решение.
Алиреза Тагизаде

5
Добро пожаловать на ТАК! Вместо того, чтобы комментировать свой пост, вы также можете редактировать свой пост. Если ваш комментарий должен объяснить ответ, то почему бы не включить его в сам ответ? Лично я не вижу, как ваш (поздний) ответ на этот старый вопрос связан с вопросом. Могу ли я предложить сначала сосредоточиться на ответах на вопросы, на которые еще нет принятого ответа?
Cfi

1
Я не могу найти вопросы Android. Как я могу видеть только вопросы Android?
Алиреза Тагизаде

3
Пожалуйста, прочитайте справочные страницы. Кроме того, комментарии не предназначены для дискуссий о том, как работает сайт, вы можете использовать чаты для живых обсуждений с другими пользователями, а также можете задавать конкретные вопросы о Meta (help-> Meta)
cfi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.