Android 10无法将文件添加至指定存储文件夹问题咨询
Android 10(API 29)开始引入分区存储机制,普通应用默认无法直接在内部存储根目录创建自定义文件夹,getExternalStorageDirectory虽被标记废弃但仍可在符合权限要求的场景使用,以下是两种适配方案:
方案1:在内部存储根目录创建/MyApp文件夹
该方案可以实现你需要的/storage/emulated/0/MyApp路径,但需要申请特殊权限,上架应用商店时需符合对应使用场景要求:
步骤1:配置AndroidManifest.xml
<!-- 安卓9及以下存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 安卓11及以上所有文件访问权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <application ... <!-- 安卓10兼容配置 --> android:requestLegacyExternalStorage="true"> ... </application>
步骤2:动态申请权限
- Android 6.0~9.0:动态申请
WRITE_EXTERNAL_STORAGE权限 - Android 10.0:动态申请
READ_EXTERNAL_STORAGE权限 - Android 11.0及以上:跳转系统设置页引导用户开启「所有文件访问权限」
步骤3:创建文件夹及文件的代码
File rootDir = Environment.getExternalStorageDirectory(); File myDir = new File(rootDir, "MyApp"); if (!myDir.exists()) { // 改用mkdirs,避免父目录不存在时创建失败 myDir.mkdirs(); } File file = new File(myDir, customer+"_"+date+".pdf");
方案2:合规替代方案(推荐)
如果不需要严格放在根目录,可以将自定义文件夹放在系统公共下载目录下,路径为/storage/emulated/0/Download/MyApp,用户同样可以从系统文件管理器直接访问,不需要申请高危特殊权限,上架无额外限制:
代码实现
// 获取系统公共下载目录 File publicDownloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File myDir = new File(publicDownloadDir, "MyApp"); if (!myDir.exists()) { myDir.mkdirs(); } File file = new File(myDir, customer+"_"+date+".pdf");
权限配置
只需正常申请基础存储权限即可,不需要MANAGE_EXTERNAL_STORAGE权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
内容的提问来源于stack exchange,提问作者EngEl
相关产品推荐
相关产品推荐

