安桌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
-
性质
- 系统标准公共目录(和 DCIM、Pictures、Movies 一类)。
- 所有应用、用户都能看到,卸载 App 不会删。
-
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。
-
-
一句话Download 是系统 "白名单公共目录",允许通过官方 API 写入,不用全开存储权限。
二、根目录下手工建的 ABC:"完全私有 / 受限"
路径:/storage/emulated/0/ABC(你自己 mkdir 的)
-
性质
- 不属于系统预定义公共目录,属于外部存储根目录下的自定义目录。
- 对 Android 10+ Scoped Storage 来说,这类目录是未授权区域。
-
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 等所有目录。
-
-
一句话 根目录自建 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/,无需权限,卸载自动删。
如果你愿意,我可以给你两套完整可直接运行的代码:
- 不用特殊权限,往 Download 写文件(MediaStore)
- 申请 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 的完整示例(含动态权限和异常处理)?