Как выбрать файл из внешнего хранилища с помощью средства выбора файлов в Android

У меня возникла проблема с выбором файла изображения из внешнего хранилища с помощью средства выбора файлов в Android. Этот вопрос является следствием этого вопроса - Нет такого файла или ошибки каталога при загрузке файла изображения с помощью Retrofit в Android. Моя проблема заключается в открытии и чтении файла из внешнего хранилища в результате активности. Я хочу преобразовать результирующий URI в файл.

Я прочитал файл PDF из папки загрузки в результате активности

Uri bookUri = data.getData();
                if(bookUri!=null)
                {
                    String filePath = bookUri.toString();//bookUri.toString()
                    String mime = app.getMimeType(filePath);
                    if(mime!=null && !mime.isEmpty() && (mime.toLowerCase()=="application/pdf" || mime.toLowerCase()=="application/txt" || mime.toLowerCase()=="application/text"))
                    {
                        bookFile = new File(bookUri.getPath());
                        ivBookFile.setImageResource(R.drawable.book_selected);
                    }
                    else{
                        Toast.makeText(getBaseContext(),"Unable to process file you have chosen.",Toast.LENGTH_SHORT).show();
                    }
                }

Как видите, я использовал new File(bookUri.getPath()); преобразовать в файл. Приведенный выше код работает хорошо. Это работает. Проблема в том, что теперь я пытаюсь открыть файл изображения в папке DCIM/Camera в результате действия.

Это код, который я использовал

Uri selectedImageUri = data.getData();
                if(selectedImageUri!=null)
                {
                    try{
                        bmpCoverImage = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri);
                        imageFile = new File(selectedImageUri.getPath());
                        if(bmpCoverImage!=null)
                        {
                            ivCoverImage.setImageBitmap(bmpCoverImage);
                        }
                    }
                    catch (IOException e)
                    {
                        Toast.makeText(getBaseContext(),"An error occurred with the file selected",Toast.LENGTH_SHORT).show();
                    }
                }

Как видите, я использовал новый File(selectedImageUri.getPath()); как я сделал при чтении файла PDF. На этот раз код не работает. Когда я делаю операцию с файлом, как в предыдущем вопросе, выдает ошибку.

я тоже таким способом пользовалась

imageFile = new File(Environment.getExternalStorageDirectory(),selectedImageUri.getPath());

У меня такая же ошибка. Как я могу правильно открыть файл изображения с внешнего хранилища? Как я могу преобразовать выбранный URI файла из внешнего хранилища в файл?

введите здесь описание изображения


person Wai Yan Hein    schedule 21.08.2016    source источник


Ответы (1)


У меня возникла проблема с выбором файла изображения из внешнего хранилища с помощью средства выбора файлов в Android.

Если вы имеете в виду код, который вы используете в этот вопрос, вы не "используете средство выбора файлов". Вы используете ACTION_GET_CONTENT, который никогда не был "средством выбора файлов" и никогда не будет "средством выбора файлов".

Я хочу преобразовать результирующий URI в файл.

Обычно в этом нет необходимости. Но, если это то, что вы хотите сделать:

  • используйте ContentResolver и openInputStream(), чтобы получить InputStream для контента, представленного Uri

  • создайте FileOutputStream в нужном файле

  • используйте ввод-вывод Java, чтобы скопировать байты из InputStream в FileOutputStream

Приведенный выше код работает хорошо. Это работает.

Это работает для небольшого количества протестированных вами устройств, для определенных действий, которые пользователь выбрал для обработки запроса ACTION_GET_CONTENT. Он не будет работать на большинстве устройств Android и не будет работать в большинстве случаев. Этот код будет работать только в том случае, если Uri имеет схему file. В большинстве случаев это не так. Вместо этого у него будет схема content, представляющая контент, предоставленный ContentProvider.

Пожалуйста, как я могу правильно открыть файл изображения с внешнего хранилища?

Если вы хотите и дальше использовать ACTION_GET_CONTENT, имейте в виду, что это не имеет никакого отношения конкретно к внешнему хранилищу. Вы не получаете файл на внешнем хранилище или где-либо еще. Вы получаете Uri. Это похоже на URL-адрес, такой как URL-адрес этой веб-страницы. Точно так же, как URL-адрес не обязательно указывает на файл на вашем жестком диске, Uri не обязательно указывает на файл в файловой системе. Используйте ContentResolver и DocumentFile для работы с Uri и содержимым, которое оно идентифицирует.

Если вы хотите всегда получать файлы во внешнем хранилище (и нигде больше), используйте фактическая библиотека выбора файлов.

person CommonsWare    schedule 21.08.2016
comment
Спасибо большое. Я попробую это. Теперь я понял, что со мной не так, и ты четко указал на меня. Теперь я получил хороший урок от тебя. - person Wai Yan Hein; 21.08.2016
comment
Я уже пробовал на нем. Я установил сборщик файлов. Он работает идеально. Большое спасибо. - person Wai Yan Hein; 21.08.2016