Android棉花糖:新文件(…)拒绝授予权限

Android棉花糖:新文件(…)拒绝授予权限,android,file,zip,android-6.0-marshmallow,Android,File,Zip,Android 6.0 Marshmallow,编辑以反映进度 如果这个问题已经得到了回答,我很抱歉 目前正在编写一个应用程序,其中内容(在一个小的zip文件中)从外部位置下载并存储在/data/data/package_name_removed/files/中,稍后读取 我目前在目录“Test.zip”中有一个zip文件 try-catch循环包含: //where filename is Test.zip Log.d("Target file is", sourceContext.getFilesDir() +"/"+ fileNam

编辑以反映进度

如果这个问题已经得到了回答,我很抱歉

目前正在编写一个应用程序,其中内容(在一个小的zip文件中)从外部位置下载并存储在/data/data/package_name_removed/files/中,稍后读取

我目前在目录“Test.zip”中有一个zip文件

try-catch循环包含:

//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
这是IOException getMessage的Log.d;我认为这是由new File()语句生成的:

D/Log_title_omitted: /data/user/0/package_name_removed/files/Test.zip: open failed: EACCES (Permission denied)
我用棒棒糖做这个;在我最近升级到棉花糖之前,我也一直在调试它。我不认为我可以安全地继续,直到我解决这个问题,因为这意味着我的应用程序将不支持6.0

我已经成功地将一个文本文件写入到这个目录,而在同一个应用程序中没有任何问题,所以我不明白为什么尝试从该目录打开一个zip文件不起作用

编辑:我还尝试将有问题的zip文件解压缩到其自己的目录,但没有成功:

//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
我知道Marshmallow现在真的在强制执行SELinux,我必须为这种情况编写代码——但我还没有弄清楚如何在代码中获得适当的权限。正确地说,我不应该在任何地方需要外部READ_,因为根据文档,不需要请求对应用程序内部存储中自己的文件目录的权限

有什么帮助吗

注意:省略包名,不重要

来自用户公用软件:

“Rooting不禁用SELinux”--不,但这并不意味着>通过根shell创建的文件以某种方式获得与>通过应用程序代码创建的文件相同的权限位/ACL/等。adb shell以这种方式运行时可能会表现得更好>

是的,这确实是因为我自己复制了文件,而不是让应用程序来做;全面拥有r权限不足以满足SELinux的要求,应用程序必须通过“创建”该文件来“拥有”该文件


我还没有在外部写入目录上测试这一点,但对于内部应用程序自己的目录也是如此。

“不能在这里使用getfiledir(),因为我们必须扩展活动”--不,
getfiledir()
是在
上下文
上实现的。“这是泛型IO类的一部分,并不意味着它自己的活动”——然后将
上下文传递给执行此工作的方法。或者,将
应用程序
单例传递给此“通用IO类”的构造函数。或者,将
getFilesDir()
传递给此类的构造函数。除了您当前的问题之外,您现有的代码可能无法用于设备上的辅助用户帐户。然而,我仍然在Test.zip上得到avc:denied{open}<代码>文件文件=新文件(sourceContext.getFilesDir()+“/”+userDir+“/”+fileName)
getFilesDir本身当前返回
/data/user/0/package\u name\u removed/files/
,这与我可以在同一应用程序中写入文件的目录一致。然而,在阅读时,我仍然无法通过SELinux测试。即使我将下载或复制的zip文件放在files/而不是files/user1/中,也会出现这种情况。这是否意味着除非SELINUX允许,否则用户目录不可读?这毫无意义,会破坏很多应用程序。“即使我将下载或复制的zip文件放在文件/”中,也会出现这种情况——你到底是如何“放置”这些文件的?你指的是你的应用程序下载的文件吗?“我的设备是根目录的,这是查看数据/数据中发生的事情所必需的”——不,不是。使用
adb外壳运行方式
。“Rooting不会禁用SELinux”--不,但这并不意味着通过根shell创建的文件以某种方式获得与通过应用程序代码创建的文件相同的权限位/ACL/等<代码>adb shell运行方式在这种方式下可能表现得更好。就我个人而言,我只读过这样的内部存储;我只通过应用程序代码在内部存储器中创建内容。