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 где угодно, как в соответствии с документацией, нет необходимости запрашивать разрешения для собственного каталога файлов приложения во внутреннем хранилище.
Любая помощь?
Примечание: название упаковки опущено, не важно.
«не может использовать getFilesDir() здесь, поскольку мы должны продлить действие» - no, 'getFilesDir()' реализовано в 'Context'. «это часть общего класса IO, который НЕ предназначен для своей собственной деятельности», - затем передайте «Контекст» методу, который выполняет эту работу. Или перейдите в синтаксис «Application» к конструктору этого «универсального класса ввода-вывода». Или передайте 'getFilesDir()' конструктору этого класса. Помимо ваших текущих проблем, ваш существующий код может не работать для учетных записей других пользователей на устройстве. – CommonsWare
Хорошо, проходя Context works. Однако я все еще получаю avc: denied {open} на Test.zip. 'File file = new File (sourceContext.getFilesDir() +"/"+ userDir +"/"+ имя_файла);' –
getFilesDir сам в настоящее время возвращает '/ data/user/0/package_name_removed/files /', и это сейчас в соответствии с каталогом я могу писать файлы в одном приложении. Однако я все еще не могу пройти сборник SELinux при чтении. Это даже если я поместил загруженный или скопированный zip-файл в файлы /, а не в файлы/user1 /. Означает ли это, что каталог пользователя НЕ читается, если SELINUX не разрешен? Это не имеет смысла и сломает множество приложений. –