安桌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 API 或 SAF(存储访问框架)。
  • 权限情况 :
    • 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 的完整示例(含动态权限和异常处理)?

相关推荐
挖掘狂人2 小时前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
codigger3 小时前
Git 三区域模型:把 add、commit、reset、merge 一次讲透
git·github·编程·编程语言
水饺编程3 小时前
第1章:开发环境搭建,在 Windows 中安装 Git
linux·c语言·汇编·git·ubuntu
idanzk3 小时前
Git 推送 GitHub 报 SSL_READ /src refspec main 不匹配 完整踩坑记录
git·github·ssl
星恒随风5 小时前
Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
linux·笔记·git·学习·github
寺中人1 天前
Xshell 完全入门指南:从安装到实战,远程连接+文件传输+会话管理全拆解
git·ssh·github·php·远程连接·xshell·运维工具
酬谢神明则必安1 天前
git学习记录01
linux·git·学习
lingchen19061 天前
版本控制 Git源代码项目管理
git
虫无涯1 天前
Coverity 如何结合 GJB8114-2013使用?
git·单元测试·嵌入式测试·coverity·静态扫描
喵本喵叁肆1 天前
Git 深度解读:从对象模型到分支指针,把版本控制的内核讲透
git