2015-09-15 23 views
0

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

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
intent.setType("text/*"); 
startActivityForResult(Intent.createChooser(intent, "select data"), SELECT_DATA); 

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

Uri DataUri = data.getData(); 
File FileUri = new File(DataUri.getPath()); 

Если преобразовать DataUri или FileUri в строку после использования GetPath или getAbsolutePath, я получаю совершенно неправильный путь.

Путь должен быть/storage/emulated/0/Documents/myFile, но он дает мне/document/primary: Documents/myFile. Я понятия не имею, что это за «первичная: Документы».

Данные самого намерения уже имеют неправильный путь, любые предложения?

+1

'Путь должен быть ...', что заставляет вас думать об этом? Что заставляет вас думать, что Uri, который вы получаете, представляет собой файловый объект?существует много других типов ресурсов, которые могут быть представлены Uri. – njzk2

ответ

3

Я использую ACTION_GET_CONTENT, так что пользователь может выбрать текстовые файлы

Нет, вы используете ACTION_GET_CONTENT, так что пользователь может выбрать какой-то контент, который имеет тип MIME из text/*. Там, где этот контент поступает, в значительной степени зависит от пользователя. Это может быть или не быть файлом в файловой системе, и если это так, это может быть или не быть файлом, к которому вы можете получить доступ непосредственно (например, внутреннее хранилище приложения Dropbox, файлы на съемном носителе на устройствах Android 4.4+).

Путь должен быть/хранение/эмулировать/0/Документы/Myfile

Нет, это не должно быть.

, но это дает мне/документ/первичный: Документы/Myfile

Что вы получите, будет варьироваться в зависимости от любой деятельности, обрабатывает ACTION_GET_CONTENT запрос. То, что эта активность будет зависеть от того, что пользователь установил, поддерживает ACTION_GET_CONTENT и того, что пользователь выбирает из этого списка установленных файлов.

Как правило, вы получите contentUri (то есть, getScheme() на Uri вернется content), как Uri будет указывать на данные, обслуживаемых ContentProvider.

Данные из самого намерения уже имеет неправильный путь

Он имеет правильный путь. Это просто не путь к файловой системе.

любые предложения?

Используйте ContentResolver и openInputStream() получить InputStream за содержание представленного contentUri.

+0

Я вижу сейчас. Я не совсем понял ACTION_GET_CONTENT, так что теперь он стал более понятным. Будет использовать «BufferedReader reader = new BufferedReader» (новый InputStreamReader (getContentResolver(). OpenInputStream (DataUri))); 'будет идентичным? Кажется, он не работает. Я передаю его как строку в строковый массив, преобразовывая его с помощью Uri.parse (UriString), а затем открывая поток с этим Uri. – Marakalastic

+0

@Marakalastic: «Использовал бы ... быть тождественным?» - то же самое? «Я передаю его как строку в строковый массив, преобразовывая его обратно с помощью Uri.parse (UriString), а затем открывая поток с этим Uri, однако» - убедитесь, что 'Uri' вы получите после того, Ури, с которого ты начал. Кроме того, имейте в виду, что эти значения Uri недолговечны. Вы не можете их перенести, например, планируя использовать их снова в следующий раз, когда ваше приложение будет работать. Подумайте о них как о URL-адресе веб-сервера, для которого требуется файл cookie сеанса. – CommonsWare

+0

Я имел в виду идентичность использования только ContentResolver, но я понимаю, что это то же самое. И да, это одно и то же, просто сделано разными способами, но в той же деятельности. Я знаю, что Ури - это то же самое, потому что я напечатал ури из моего массива после того, как произойдет исключение. Кроме того, я довольно много копировал и вставлял весь код getContentResolver. Единственное различие заключалось в том, что я не изменил его с Uri на строку и обратно. Первоначально я хотел хранить кучу путей в массиве, чтобы я мог их открывать по одному. Теперь я решил сохранить данные в виде строки в массиве. – Marakalastic

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