Android 12(API30+)创建目录与PDF文件失败问题求助
问题原因及解决方案
核心原因
- Android 12(API 31)彻底废弃了
requestLegacyExternalStorage属性,这个配置仅对Android 10(API 29)和Android 11(API 30)生效,Android 12强制启用分区存储规则,无论是否配置该属性都无法绕过。 - 你的代码直接在外部存储根目录创建
/pdf自定义文件夹并写入文件,这违反了分区存储的权限规则——APP无权在公共存储根目录创建自定义目录,也无法直接写入这类非标准公共目录。
可行解决方案
方案1:使用APP私有外部存储(推荐,无需额外权限)
私有外部存储目录属于APP专属空间,读写无需申请权限,卸载APP时会自动删除,适合存储APP专属文件:
FileOutputStream fOut = null; File root = getExternalFilesDir(null); // 获取APP私有外部存储根目录,也可指定类型如DIRECTORY_DOCUMENTS File dir = new File(root.getAbsolutePath() + "/pdf"); if (!dir.exists()) { dir.mkdirs(); // 用mkdirs确保父目录不存在时也能创建 } String filename = CustomerName + ".pdf"; File myFile = new File(dir, filename); fOut = new FileOutputStream(myFile); // 后续写入操作... fOut.close(); // 记得关闭流
该目录路径为/Android/data/[你的包名]/files/pdf。
方案2:使用公共存储的标准目录(需权限)
如果需要文件在APP卸载后保留,可选择系统预设的公共目录(如Download、Documents等),需注意权限申请:
- 在Manifest中声明权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+ 可替换为更细粒度的权限:android.permission.READ_MEDIA_IMAGES等,根据文件类型选择 -->
- 动态申请权限(Android 6.0+ 必须);
- 代码中写入标准公共目录:
FileOutputStream fOut = null; File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File pdfDir = new File(publicDir, "pdf"); if (!pdfDir.exists()) { pdfDir.mkdirs(); } String filename = CustomerName + ".pdf"; File myFile = new File(pdfDir, filename); fOut = new FileOutputStream(myFile); // 后续写入操作... fOut.close();
注意:Android 13及以上,写入公共目录可能需要使用ACTION_CREATE_DOCUMENT系统文件选择器,让用户手动确认保存位置,避免权限限制。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

