关于Android11如何使用直接路径对data和obb目录进行操作
问题背景
Android11及更高版本,谷歌直接限制了对data和obb目录的访问,File API的很多方法都不再适用:
假如我们要复制一个文件到obb目录,会报以下权限问题而失败
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Android/obb/com.xxx.yyy.zzz/main.1.com.xxx.yyy.zzz.obb: open failed: EACCES (Permission denied)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at libcore.io.IoBridge.open(IoBridge.java:492)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at java.io.FileOutputStream.(FileOutputStream.java:236)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at java.io.FileOutputStream.(FileOutputStream.java:186)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at com.kuntliu.loghelper.ObbFile$1$2.run(ObbFile.java:158)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at java.lang.Thread.run(Thread.java:923)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at libcore.io.Linux.open(Native Method)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
2021-08-03 13:20:29.646 28577-25413/com.kuntliu.loghelper W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
2021-08-03 13:20:29.647 28577-25413/com.kuntliu.loghelper W/System.err: at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
2021-08-03 13:20:29.647 28577-25413/com.kuntliu.loghelper W/System.err: at android.app.ActivityThreadAndroidOs.open(ActivityThread.java:8373)
2021-08-03 13:20:29.647 28577-25413/com.kuntliu.loghelper W/System.err: at libcore.io.IoBridge.open(IoBridge.java:478)
2021-08-03 13:20:29.647 28577-25413/com.kuntliu.loghelper W/System.err: … 4 more
那么该如何规避绕过这个限制呢,其实很简单,去申请一个安装未知来源的权限即可
Uri uri = Uri.parse("package:"+ context.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, uri);
context.startActivity(intent);
备注:如果有什么错误希望可以大胆指出,本人新手一枚🤣