安桌15系统文件直接存到其他目录要权限吗?/storage/emulated/0/Downloa

安桌15系统文件直接存到其他目录要权限吗?/storage/emulated/0/Download

要权限,而且 Android 15 不允许直接用路径读写 /storage/emulated/0/Download

download目录算时半公开允许写入吧,再上一层手工创建的ABC目录要有什么区别

搜索 2 个关键词,参考 11 篇资料

先把结论说清楚(Android 15 / API35):

  • /storage/emulated/0/Download :是系统预定义公共目录 ,属于 "半公开可写"------
    • 不能直接 new File(path) 写;
    • 但可以用 MediaStore.Downloads 写入,不需要 MANAGE_EXTERNAL_STORAGE
  • /storage/emulated/0/ABC(你自己建的) :属于根目录下自定义文件夹 ------
    • 默认完全禁止直接读写
    • 想直接 new File("/storage/emulated/0/ABC/xxx")必须要 MANAGE_EXTERNAL_STORAGE(所有文件访问权限)

下面拆开讲区别。


一、Download 目录:"半公开、有优待"

路径:/storage/emulated/0/Download

  1. 性质

    • 系统标准公共目录(和 DCIM、Pictures、Movies 一类)。
    • 所有应用、用户都能看到,卸载 App 不会删
  2. Android 15 写入规则

    • ❌ 不能直接用路径: java

      运行

      复制代码
      new File("/storage/emulated/0/Download/a.txt") // 失败
    • ✅ 允许用 MediaStore 写入,不需要 "所有文件权限"

      java

      运行

      复制代码
      ContentValues values=new ContentValues();
      values.put(MediaStore.Downloads.DISPLAY_NAME, "a.txt");
      Uri uri=getContentResolver().insert(
          MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
      // 然后 openOutputStream 写数据
    • 权限:只要普通存储读取权限即可,不用 MANAGE_EXTERNAL_STORAGE

  3. 一句话Download 是系统 "白名单公共目录",允许通过官方 API 写入,不用全开存储权限。


二、根目录下手工建的 ABC:"完全私有 / 受限"

路径:/storage/emulated/0/ABC(你自己 mkdir 的)

  1. 性质

    • 不属于系统预定义公共目录,属于外部存储根目录下的自定义目录
    • 对 Android 10+ Scoped Storage 来说,这类目录是未授权区域
  2. Android 15 写入规则

    • 默认完全不能直接读写

      java

      运行

      复制代码
      new File("/storage/emulated/0/ABC/b.txt") // 无权限,报错
    • ✅ 只有一种办法:申请 MANAGE_EXTERNAL_STORAGE

      xml

      复制代码
      <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

      并引导用户在设置里手动打开 "允许访问所有文件"。

    • 打开后:你可以像老安卓一样随便读写 /ABC、/Download、/Pictures 等所有目录

  3. 一句话 根目录自建 ABC:不在系统白名单里,默认禁止直接访问;要访问必须开 "所有文件权限"


三、对比表(一眼看懂)

表格

目录 /storage/emulated/0/Download /storage/emulated/0/ABC(自建)
类型 系统预定义公共目录 根目录自定义目录
Android15 直接 File 读写 ❌ 禁止 ❌ 禁止
MediaStore 写入 ✅ 允许(不用特殊权限) ❌ 不支持
需 MANAGE_EXTERNAL_STORAGE ❌ 不需要 必须要
卸载 App 删除文件 ❌ 不删 ❌ 不删

四、你实际开发怎么选?

  • 只想放下载类文件 → 用 MediaStore 写 Download,最简单、不用特殊权限。
  • 一定要在根目录建自己的文件夹(/ABC)→ 必须要 MANAGE_EXTERNAL_STORAGE,并做好用户授权引导。
  • 只是 App 自己用、不想被别的 App 乱看 → 用 App 私有目录/Android/data/包名/files/无需权限,卸载自动删

如果你愿意,我可以给你两套完整可直接运行的代码:

  1. 不用特殊权限,往 Download 写文件(MediaStore)
  2. 申请 MANAGE_EXTERNAL_STORAGE,往 /ABC 写文件

一、先说结论(Android 15,API 35)

  • 普通第三方 App :❌ 不能直接用 new File("/storage/emulated/0/Download/xxx") 去创建 / 写入。✅ 必须用 MediaStore APISAF(存储访问框架)
  • 权限情况
    • WRITE_EXTERNAL_STORAGE 已失效(只对 Android 10 以下有用)。
    • 公共下载目录属于共享存储 ,默认不能随便写
    • 想 "完全自由读写所有目录":需要 MANAGE_EXTERNAL_STORAGE(所有文件访问权限),用户手动在设置里开启。

二、/storage/emulated/0/Download 本质

这是系统公共下载目录 ,属于 Scoped Storage(分区存储) 管控范围:

  • Android 10:引入,可关闭
  • Android 11+:强制开启
  • Android 15:进一步收紧,禁止直接路径访问公共目录

三、你要往 Download 存文件,正确做法(二选一)

方案 A:用 MediaStore(推荐,无需 MANAGE_EXTERNAL_STORAGE)

java

运行

复制代码
ContentValues values = new ContentValues();
values.put(MediaStore.Downloads.DISPLAY_NAME, "test.txt");
values.put(MediaStore.Downloads.MIME_TYPE, "text/plain");
// Android 10+ 不用写 RELATIVE_PATH 也能进 Download
Uri uri = getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
// 然后 openOutputStream 写入数据
  • 权限:不需要 WRITE_EXTERNAL_STORAGE
  • 结果:文件直接出现在 Download 目录
方案 B:要 "像以前一样随便写"
  • 声明权限:

xml

复制代码
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  • 代码判断并引导用户开启:

java

运行

复制代码
if (!Environment.isExternalStorageManager()) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}
  • 开启后:可以直接用 File 读写 /storage/emulated/0/Download 和其他目录。

四、一句话总结

Android 15:/storage/emulated/0/Download 要权限,且默认不让直接路径写;要么用 MediaStore,要么让用户开 "所有文件访问权限"

要不要我给你一段可直接复制运行的 MediaStore 写入 Download 的完整示例(含动态权限和异常处理)?

相关推荐
解道Jdon18 小时前
从Go转向Rust迁移指南:靠自觉 vs. 靠编译器
ide·windows·git·svn·eclipse·github·visual studio
霸道流氓气质19 小时前
Git 三方合并策略详解
git
Cry丶19 小时前
GitHub 开源项目 PR 提交流程:从 Fork 到 CLA 签署
git·github·开源贡献·pull request·cla
花归去20 小时前
Git 提交代码规范指南
git·代码规范
IT布道20 小时前
[Git] Vibe Coding一个Git分支保护管理工具
git·webui·分支控制
霸道流氓气质20 小时前
Git 常用排查指令详解
git
解道Jdon1 天前
[Budi插件:VsCode状态栏显示Copilot使用情况
ide·windows·git·svn·eclipse·github·visual studio
kisshyshy1 天前
掌握 Git 基础
git
全糖可乐气泡水1 天前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度