Android 10 创建文件 Permission denied

1,573 阅读1分钟

在build.gradle(app)中,compile、target的对应版本 at least 29时,就是Android版本为10时,其中创建文件,不仅仅需要静态申请、动态申请,还需要在Androidmainfest文件的application中添加属性

android:requestLegacyExternalStorage="true"

否则,file.createNewFile()会报IOException,Permission denied错误。

ps:

最初的时候,我还以为是自己的权限没有申请,可是在AndroidManifest中确实申请了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

而且,也在代码中动态申请了。 可是,debug的时候,发现file != null,但是file.exits确实空的,file的路径是文件夹。 怀疑是路径错误,原先访问

Android/data

,现在改为

/storage/emulated/0

结果还是报IOException,at java.io.UnixFileSystem.createFileExclusively0。

搜了下,发现错误是Permission denied而不是No such file or directory,估计和权限有关。

而关于sdcard的另一个相关权限、

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

发现动态申请的时候会返回false,这个权限应该级别高,重新找思路。

最后在参考了 Android10创建文件Permission denied_吴庆森的博客-CSDN博客 ,文件创建成功。

更新,还是文件读写权限的问题。

app内置安装apk,在Android11以下测试过来发现没有问题,fileDownloader正常下载并安装,但是到了Android11及以上,fileDownloader直接下载不了报错:Create parent directory failed, please make sure you have permission to create file or directory

参考一篇文章 Android11适配,现在单纯在application加

android:requestLegacyExternalStorage="true"

已经不起作用了。文件存储路径Environment.getExternalStorageDirectory() 的访问权限被禁止,应用只能访问应用专属目录,即context.getExternalFilesDir(),而它对应的路径是storage/emulated/0/Android/data/packagename/files/