Android开发:如何在内部存储根目录创建应用专属文件夹?
如何在Android创建类似WhatsApp的公共根目录文件夹
首先得澄清一个常见的概念混淆:你说的「内部存储根目录」其实是Android里的外部存储主分区——就是你在文件管理器里看到的那个“内部存储”根目录(路径通常是/storage/emulated/0/),而WhatsApp的文件夹恰恰就创建在这里!你当前的代码其实已经在这个位置生成文件夹了,但写法不够规范,而且不同Android版本的权限规则不一样,我给你梳理下正确的实现方式:
先搞懂存储概念
- 真正的内部存储:是应用的私有目录,路径为
/data/data/[你的应用包名]/,只有你的应用能访问(无Root权限的情况下),卸载应用时会被彻底删除,WhatsApp绝不会在这里创建文件夹。 - 外部存储主分区:就是你平时操作的“内部存储”根目录,所有应用都能访问,卸载应用后文件夹会保留,这正是WhatsApp的文件夹所在位置。
针对不同Android版本的实现
1. Android 10(API 29)及以下版本
这个版本相对宽松,只需要存储权限即可:
- 第一步:在
AndroidManifest.xml中声明权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - 第二步:运行时申请权限(Android 6.0+必须做)
你需要先判断权限是否已授予,没授予的话弹出申请对话框,网上有很多成熟的权限申请工具类可以直接复用。 - 第三步:创建文件夹的正确代码
// 获取外部存储根目录,直接拼接文件夹名称 File appFolder = new File(Environment.getExternalStorageDirectory(), "student"); if (!appFolder.exists()) { boolean isCreated = appFolder.mkdir(); // 可以在这里判断创建结果 if (isCreated) { // 创建成功,后续可以做文件操作 } else { // 创建失败,大概率是权限没申请或者路径有问题 } }
2. Android 11(API 30)及以上版本
从Android 11开始,系统对公共存储的写入做了严格限制:
- 如果一定要在根目录创建公共文件夹,需要申请
MANAGE_EXTERNAL_STORAGE权限,这个权限需要用户手动到系统设置里开启:- 在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> - 检查权限并引导用户开启:
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 appFolder = new File(Environment.getExternalStorageDirectory(), "student"); if (!appFolder.exists()) { boolean isCreated = appFolder.mkdir(); } } }
- 在
- 如果你不需要文件夹在公共根目录(比如只是应用自己用,卸载可以删除),可以用应用私有外部存储路径
Context.getExternalFilesDir(null),这个不需要特殊权限,但路径是/storage/emulated/0/Android/data/[你的包名]/files/,不符合WhatsApp的场景。
总结
你当前的代码其实已经在正确的位置创建文件夹了,只是写法不够规范。按照上面的版本适配方案调整后,就能实现和WhatsApp一样的效果——在文件管理器显示的“内部存储”根目录下生成student文件夹。
内容的提问来源于stack exchange,提问作者Rashedur Rahman
相关产品推荐
相关产品推荐

