在我的产品的自动化测试期间,我将文件推送到应用程序私人目录并chmod
该文件,以便应用程序可以访问它。关于API< Marshmallow,这很好,应用程序从未遇到访问文件的问题。
现在,在某些文件上,我尝试打开它时会收到以下日志:
W/System.err(7669): Caused by:
java.io.FileNotFoundException: /data/user/0/foo/foo.txt: open failed: EACCES (Permission denied) 09-28 18:20:56.724:
W/System.err(7669): at libcore.io.IoBridge.open(IoBridge.java:452) 09-28 18:20:56.724:
W/System.err(7669): at java.io.FileInputStream.<init>(FileInputStream.java:76) 09-28 18:20:56.724:
W/System.err(7669): at android.app.ContextImpl.openFileInput(ContextImpl.java:384) 09-28 18:20:56.724:
W/System.err(7669): at android.content.ContextWrapper.openFileInput(ContextWrapper.java:177) 09-28 18:20:56.724:
W/System.err(7669): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 09-28 18:20:56.724:
W/System.err(7669): at libcore.io.Posix.open(Native Method) 09-28 18:20:56.724:
W/System.err(7669): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 09-28 18:20:56.724:
W/System.err(7669): at libcore.io.IoBridge.open(IoBridge.java:438) 09-28 18:20:56.716:
W/pool-5-thread-1(8279): type=1400 audit(0.0:57): avc: denied { search } for name="files" dev="mtdblock1" ino=7314 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=dir permissive=0
我该如何解决?
答案 0 :(得分:5)
Android Marshmallow已采用其底层操作系统SELinux(安全增强型Linux)的扩展文件属性,因此在应用程序之间通过shell推送文件和首选项会出现问题,而不是通过具有权限的应用程序FS。
首先,确保正确chmod
文件。然后,确保文件也正确拥有。您可以通过ls -la file
检查正常文件的所有者和群组的外观,然后将相关文件的组更改为您在上一个命令中找到的chgrp user.group file
$ ls -la
drwxrwxrwx u0_a69 u0_a69 2015-09-28 18:20 existing_file
drwxrwxrwx root root 2015-09-28 18:20 file
$ chown u0_a69.u0_a69 file
如果这些都不起作用,请按ls -Z file
检查扩展文件属性并阅读https://fedoraproject.org/wiki/Security_context?rd=SELinux/SecurityContext以了解您正在查看的内容,然后使用chcon some:extended:security:attributes file
更改文件权限。
$ ls -Z
drwxrwx--x u0_a69 u0_a69 u:object_r:app_data_file:s0:c512,c768 existing_file
drwxrwx--x u0_a69 u0_a69 u: file
$ chcon u:object_r:app_data_file:s0:c512,c768 file
如果仍然无法正常工作,/system/bin
中的二进制文件称为setenforce
,它会禁用Marshmallow底层SELinux的扩展文件系统安全性。
从root用户调用setenforce permissive
,您的应用就可以访问所需的文件了。这可能会掩盖错误,因此请谨慎使用。
$ setenforce permissive
答案 1 :(得分:1)
在Android Manifest文件中尝试输入
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在运行时,您可以检查授予的权限,或直接授予您设置中所有权限的访问权限 - &gt; App-&gt;权限,看看它是否有效......
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if(checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED) {
return true;
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
} else {
return true;
}
}