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

Android 13中无需SAF,在设备根目录创建应用专属PDF存储文件夹的方法

在Android设备根目录创建应用专属PDF文件夹的方案

一、Android 9(API 28)及以下版本

该版本无Scoped Storage限制,只需声明并动态申请WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,即可通过File类直接在根目录创建文件夹:

权限声明(Manifest文件)

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

创建文件夹代码

// 获取外部存储根目录,创建名为"MyAppPDFs"的文件夹
File pdfFolder = new File(Environment.getExternalStorageDirectory(), "MyAppPDFs");
if (!pdfFolder.exists()) {
    boolean isCreated = pdfFolder.mkdirs();
    if (isCreated) {
        // 文件夹创建成功,可执行文件写入操作
    } else {
        // 处理创建失败的异常场景
    }
}

注:API 23及以上版本需动态申请上述权限。

二、Android 10(API 29)版本

Android 10引入Scoped Storage,但可通过过渡方案绕过限制:在Manifest的application标签中添加android:requestLegacyExternalStorage="true",之后沿用Android 9及以下的代码逻辑创建根目录文件夹。不过这只是临时方案,建议逐步适配Scoped Storage规范。

三、Android 11(API 30)及以上版本

该版本强制启用Scoped Storage,直接在根目录创建文件夹需申请MANAGE_EXTERNAL_STORAGE特殊权限:

权限声明(Manifest文件)

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    android:minSdkVersion="30" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

引导用户开启权限并创建文件夹

该权限无法通过常规弹窗申请,需跳转至系统设置页面让用户手动开启:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Environment.isExternalStorageManager()) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivity(intent);
    } else {
        // 已获取权限,执行文件夹创建
        File pdfFolder = new File(Environment.getExternalStorageDirectory(), "MyAppPDFs");
        if (!pdfFolder.exists()) {
            pdfFolder.mkdirs();
        }
    }
}

关键提醒

  • MANAGE_EXTERNAL_STORAGE权限的Google Play审核门槛极高,仅文件管理器、备份恢复、反病毒等特定类型应用可通过审核,普通应用提交后大概率被拒。
  • 更合规的替代方案:使用应用专属外部存储目录(Context.getExternalFilesDir(null)),无需额外权限,应用拥有完全访问权,卸载时会自动清理目录下文件。代码示例:
File pdfFolder = new File(getExternalFilesDir(null), "PDFs");
if (!pdfFolder.exists()) {
    pdfFolder.mkdirs();
}

此方案符合Scoped Storage设计规范,无权限审核风险。

内容的提问来源于stack exchange,提问作者Andyson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:11