Следующий код используется для запуска файлового менеджера, чтобы позволить пользователю выбрать файл
Нет, это не так. Он используется для получения части контента из любой активности, поддерживающей эту структуру 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()
).
Большое спасибо за подсказку. Вот как приложение получает путь к файлу: aimData.getData(). GetPath(), где aimData - onActivityResult (int requestCode, int resultCode, Intent intentData). – Hong
@Hong: Опять же, это не путь к файлу, не более, чем '/ questions/39337012/why-is-the-parent-path-of-a-selected-file-not-usable' - это путь к файлу. Если схема 'Uri' была' file', то 'getPath()' * does * возвращает путь к файлу, хотя, возможно, не тот, который вам полезен (например, указывает на что-то на съемном носителе). – CommonsWare
Еще раз спасибо за разъяснение. URI: content: //com.android.externalstorage.documents/document/2071-13DB%3ADownload%2Ffoo.txt – Hong