You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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等),需注意权限申请:

  1. 在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等,根据文件类型选择 -->
  1. 动态申请权限(Android 6.0+ 必须);
  2. 代码中写入标准公共目录:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:28:01