USB-накопитель Android 6.0

USB-накопители теперь официально поддерживаются Android исключительно через Storage Access Framework. Похоже, хранилище не монтируется в обычном смысле, насколько я могу судить, единственный способ получить доступ к данным — через Document API и ContentResolver.

1) Больше нет простого File способа доступа к хранилищу после прохождения SAF?

2) Если нет, то как лучше всего взаимодействовать с «файлами» на USB-накопителе в NDK, если у нас нет доступа к путям.


person Anthony    schedule 09.01.2016    source источник
comment
Больше нет простого файлового способа доступа к хранилищу после прохождения SAF? -- Насколько мне известно, USB Mass Storage обрабатывается так же, как и другие формы съемное хранилище. В этом случае getExternalFilesDirs() и kin (обратите внимание на множественное число) могут возвращать File местоположений на съемном носителе, из которых ваше приложение может читать и записывать. Кроме того, у вас нет прямого доступа.   -  person CommonsWare    schedule 09.01.2016
comment
Если javadoc не был обновлен: External storage devices returned here are considered a permanent part of the device, including both emulated external storage and physical media slots, such as SD cards in a battery compartment. The returned paths do not include transient devices, such as USB flash drives.   -  person Anthony    schedule 09.01.2016
comment
Что ж, Android не может самостоятельно определить, находится ли слот для SD-карты в батарейном отсеке или нет, поэтому я бы отнесся к этому фрагменту документации с долей скептицизма. При этом, если getExternalFilesDirs() и kin не работают, то у вас вообще нет доступа к флешке, разве что через Storage Access Framework.   -  person CommonsWare    schedule 09.01.2016
comment
Подтвержденный getExternalFilesDirs() возвращает только хранилище, смонтированное на оборудовании. Удивительно, что изменение такого масштаба уместилось всего в одном предложении в примечаниях к выпуску. 4.4, 5.0, 6.0. Я вижу, куда они хотели пойти с файлами, но я не думаю, что они могли бы сделать это хуже. Постоянные крупные переделки в течение двух лет.   -  person Anthony    schedule 09.01.2016
comment
'если getExternalFilesDirs() и kin не работают, то у вас вообще нет доступа к флешке, '. Ну, это не причина, поскольку я никогда не видел упоминаний USB-накопителя там, где он всегда был доступен через /mnt или /storage. Но на самом деле я могу подтвердить, что он недоступен с помощью проводника на 6.0.   -  person greenapps    schedule 09.01.2016
comment
Это not mounted. Он is доступен. Это просто требует НАМНОГО больше работы, чем раньше. Используя SAF, вы можете получить что-то вроде: content://com.android.externalstorage.documents/tree/0000-0000%3A/document/0000-0000%3ADCIM%2F100EOS5D%2FIMG_0081.CR2, которое может быть успешно преобразовано в поток с помощью ContentResolver. Я готов поспорить, что это вдвое меньше скорости, и я знаю, что это буквально в сотни раз больше усилий, но это можно сделать.   -  person Anthony    schedule 10.01.2016


Ответы (1)


В реализации DocumentFile есть много недостатков, в первую очередь в том, что касается URI "дерево" и "документ" и тот факт, что вы не удается сохранить uri "дерева" из-за серьезной ошибки в фабрике, а также в отсутствие «родительской» функциональности, поэтому я написал полезную функцию с умным названием UsefulDocumentFile

https://github.com/rcketscientist/DocumentActivity/blob/master/library/src/main/java/com/anthonymandra/framework/UsefulDocumentFile.java

UsefulDocumentFile может стоять сам по себе, но в целом проект представляет собой попытку исправить путаницу жизненного цикла, созданную Google с помощью SAF (если вы запрашиваете разрешение на запись, вы прерываете ожидающее действие записи, чтобы открыть SAF, что ужасно HMI).

person Anthony    schedule 07.04.2016