2016-08-21 4 views
0

У меня возникла проблема с выбором файла изображения из внешнего хранилища с помощью файла picker в Android. Этот вопрос является следствием этого вопроса - No such file or diectory error in image file upload using Retrofit in Android. Какая проблема заключается в открытии и чтении файла из внешнего хранилища при действии. Я хочу преобразовать URI результата в файл.Как выбрать файл из внешнего хранилища с помощью файла picker в Android

Я прочитал 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(); 
        } 
       } 

Как вы можете видеть, что я использовал новый файл (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(); 
        } 
       } 

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

Я использовал этот способ также

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

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

enter image description here

ответ

1

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

Если вы имеете в виду код, который вы используете в this question, вы а не «использовать сборщик файлов». Вы используете ACTION_GET_CONTENT, который никогда не был «сборщиком файлов», и никогда не будет «сборщиком файлов».

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

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

  • использование ContentResolver и openInputStream() получить InputStream на содержание представленного Uri

  • создать FileOutputStream на нужный файл

  • используйте Java I/O для копирования байтов из InputStream в FileOutputStream

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

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

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

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

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

+0

Спасибо, что так много. Я постараюсь. Теперь я понял, что со мной не так, и я четко указал мне. Теперь я узнал хороший урок от u. –

+0

Я уже пробовал. Я установил сборщик файлов. Он работает отлично. Большое спасибо. –