2015-12-31 2 views
0

EDITED, чтобы отразить прогресс.Android Marshmallow: новый файл (...) дает разрешение отклонено

Если на этот вопрос уже был дан ответ, извините.

В настоящее время создается приложение, в котором содержимое (в небольшом zip-файле) загружается из внешнего местоположения и сохраняется внутри/data/data/package_name_removed/files /, чтобы быть прочитанным позже.

В настоящее время у меня есть zip-файл в этом каталоге «Test.zip».

Петля примерки улов, содержащий:

//where filename is Test.zip 


Log.d("Target file is", sourceContext.getFilesDir() +"/"+ fileName); 
File file = new File(sourceContext.getFilesDir() +"/"+ fileName); 
ZipFile loadedFile = new ZipFile(file); 

//where sourceContext is passed into this object from the base Activity class 

Не похоже, чтобы работать в Зефир:

D/Target file is: /data/user/0/package_name_removed/files/Test.zip 
W/package_name_removed: type=1400 audit(0.0:11699): avc: denied { open } for name="Test.zip" dev="mmcblk0p29" ino=57426 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0 

Это Log.d из IOException GetMessage; Я думаю, что это вызвано новым оператором File():

D/Log_title_omitted: /data/user/0/package_name_removed/files/Test.zip: open failed: EACCES (Permission denied) 

У меня было это работает в Lollipop; отлаживал его для предварительного леденца, пока я недавно не перешел в Зефир. Я не думаю, что могу спокойно продолжать, пока не выясню это, потому что это означает, что мое приложение не будет поддерживать 6.0.

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

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

//where file is now a json file "Test.json" 
//located in .getFilesDir()/Test/ 
String loadedName = fileName.substring(0, fileName.length() - 5); //I need to reuse the string later.".json" is 5 char. 
Log.d("Target is", sourceContext.getFilesDir() +"/"+ loadedName +"/" + fileName); 
File file = new File(sourceContext.getFilesDir() + "/"+ loadedStoryName +"/" + fileName); 

И получил:

D/DOH: /data/user/0/package_name_removed/files/Test/Test.json: open failed: EACCES (Permission denied) 
W/package_name_removed: type=1400 audit(0.0:22152): avc: denied { search } for name="Test" dev="mmcblk0p29" ino=57184 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=dir permissive=0 

Я понимаю, Зефир действительно соблюдение SELinux в настоящее время , и я должен кодировать для этого случая - но я не смог выяснить, как получить правильные разрешения в коде. По правде говоря, мне не нужно READ_EXTERNAL где угодно, как в соответствии с документацией, нет необходимости запрашивать разрешения для собственного каталога файлов приложения во внутреннем хранилище.

Любая помощь?

Примечание: название упаковки опущено, не важно.

+0

«не может использовать getFilesDir() здесь, поскольку мы должны продлить действие» - no, 'getFilesDir()' реализовано в 'Context'. «это часть общего класса IO, который НЕ предназначен для своей собственной деятельности», - затем передайте «Контекст» методу, который выполняет эту работу. Или перейдите в синтаксис «Application» к конструктору этого «универсального класса ввода-вывода». Или передайте 'getFilesDir()' конструктору этого класса. Помимо ваших текущих проблем, ваш существующий код может не работать для учетных записей других пользователей на устройстве. – CommonsWare

+0

Хорошо, проходя Context works. Однако я все еще получаю avc: denied {open} на Test.zip. 'File file = new File (sourceContext.getFilesDir() +"/"+ userDir +"/"+ имя_файла);' –

+0

getFilesDir сам в настоящее время возвращает '/ data/user/0/package_name_removed/files /', и это сейчас в соответствии с каталогом я могу писать файлы в одном приложении. Однако я все еще не могу пройти сборник SELinux при чтении. Это даже если я поместил загруженный или скопированный zip-файл в файлы /, а не в файлы/user1 /. Означает ли это, что каталог пользователя НЕ читается, если SELINUX не разрешен? Это не имеет смысла и сломает множество приложений. –

ответ

0

От пользователя CommonsWare:

«Укоренение не отключает SELinux» - нет, но это не означает, что файлы,> которые вы создаете через корневую оболочку каким-то образом получить то же самое разрешение бит/списки ACL/и т.д. , как> делать файлы, созданные с помощью кода приложения. adb shell run-as может вести себя лучше таким образом.

Да, это было действительно потому, что я сам скопировал файл, а не приложение. наличие r разрешений по всем разделам недостаточно для удовлетворения SELinux, приложение должно «владеть» файлом, будучи тем, кто «создает» его.

Мне еще нужно проверить это на внешнем каталоге записи, но это верно для собственного каталога внутреннего приложения.

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