2016-09-05 2 views
0

Следующий код используется для запуска файлового менеджера, чтобы позволить пользователю выбрать файл:Почему родительский путь к выбранному файлу не используется?

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.addCategory(Intent.CATEGORY_OPENABLE); 
intent.setType("*/*"); 
startActivityForResult(intent, REQUEST_CODE_CUSTOM_FOLDER); 

Если пользователь выбирает файл foo.txt в папке загрузки, путь возвращенного файла является

/document/2071-13DB:Download/foo.txt 

Нет проблем при чтении этого файла. Когда приложение пытается записать текстовый файл (foo_new.txt) в папку «/ документ/2071-13DB: Скачать», он получает следующее исключение:

Error:Directory '/document/2071-13DB:Download' could not be created. 

Может кто-нибудь пролить некоторый свет на это? Я пытаюсь разрешить пользователю выбирать папку для приложения для сохранения файлов.

ответ

1

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

Нет, это не так. Он используется для получения части контента из любой активности, поддерживающей эту структуру Intent.

Если пользователь выбирает файл foo.txt в папке загрузки, путь возвращенного файла является

Вы не получаете файл. Вы получаете Uri для части контента. В частности, я сильно подозреваю, что этот Uri имеет схему content. В этом случае путь не имеет смысла для вас.

Когда приложение пытается записать текстовый файл (foo_new.txt) в папку «/ документ/2071-13DB: Скачать», он получает следующее исключение

То есть не папка. С вашей точки зрения, это случайная серия символов.

Например, URL этой веб-страницы: https://stackoverflow.com/questions/39337012/why-is-the-parent-path-of-a-selected-file-not-usable. Вы можете использовать HTTP-клиент для чтения содержимого этой страницы. Однако, если вы попытаетесь использовать объект File Java для записи нового файла на /questions/39337012/ на свой компьютер, вы обнаружите, что это не сработает, потому что на вашем компьютере нет папки /questions/39337012/. Здесь URL-адрес указывает на контент, который не находится в файловой системе вашего компьютера.

Аналогичным образом вы не можете выполнять струнные манипуляции с частью Uri и придумывать еще один Uri, который вы можете использовать. A Uri не должен указывать на файл в файловой системе.

Я пытаюсь разрешить пользователю выбирать папку для приложения для сохранения файлов.

Используйте a directory-chooser library, затем.

Или на устройствах Android 5.0+ используйте ACTION_OPEN_DOCUMENT_TREE, который является частью структуры доступа к хранилищу. Оттуда используйте DocumentFile для создания новых папок, создания нового содержимого в этих папках и т. Д., все используют значения Uri, не пытаясь расшифровать фрагменты значений Uri (например, getPath()).

+0

Большое спасибо за подсказку. Вот как приложение получает путь к файлу: aimData.getData(). GetPath(), где aimData - onActivityResult (int requestCode, int resultCode, Intent intentData). – Hong

+1

@Hong: Опять же, это не путь к файлу, не более, чем '/ questions/39337012/why-is-the-parent-path-of-a-selected-file-not-usable' - это путь к файлу. Если схема 'Uri' была' file', то 'getPath()' * does * возвращает путь к файлу, хотя, возможно, не тот, который вам полезен (например, указывает на что-то на съемном носителе). – CommonsWare

+0

Еще раз спасибо за разъяснение. URI: content: //com.android.externalstorage.documents/document/2071-13DB%3ADownload%2Ffoo.txt – Hong

Смежные вопросы