Android创建内部存储文件夹提示成功但实际未生成问题求助
问题核心原因
你遇到的问题本质是Android不同版本的外部存储权限策略变化导致的,核心问题有三个:
Environment.getExternalStorageDirectory()已被官方废弃
从Android 10(API 29)开始,系统引入分区存储特性,对公共存储根目录的访问做了严格限制,即使你申请了WRITE_EXTERNAL_STORAGE权限,也无法直接在这个路径下创建目录。你当前的代码没有判断mkdir()的返回值,该方法创建失败会返回false,你直接忽略返回值就弹出成功提示,自然会出现提示和实际结果不符的情况。
你可以修改代码验证实际创建结果:
if(!file.exists()){ boolean createResult = file.mkdir(); Toast.makeText(getContext(), createResult ? "Successful" : "Create failed", Toast.LENGTH_SHORT).show(); }
- 为什么拷贝资源的代码可以正常运行
你拷贝文件时用的getContext().getExternalFilesDir(null)路径属于应用专属的外部存储目录,路径格式一般为Android/data/你的应用包名/files/,这个目录是应用私有的,从Android 4.4开始访问该目录下的内容不需要申请任何存储权限。你把路径里的files替换成myfolder后,仍然处于你应用的专属目录范围内,系统不会限制读写操作,所以可以成功创建文件。 - 权限申请逻辑存在错误
你的权限申请判断逻辑有问题:你用SEND_SMS权限的shouldShowRequestPermissionRationale返回值作为是否申请所有权限的判断依据,只要用户之前拒绝过SEND_SMS权限并勾选了「不再询问」,你就不会触发包括存储权限在内的所有权限申请。另外如果你的应用目标版本是Android 13(API 33)及以上,WRITE_EXTERNAL_STORAGE权限已经完全失效,即使申请也不会获得授权。
解决方案
如果你只需要在应用专属目录下创建文件夹,不需要申请任何存储权限,直接修改createDir方法即可:
private void createDir() { String folderName = "myFolder"; // 在应用专属外部存储目录下创建文件夹 File appDir = new File(requireContext().getExternalFilesDir(null).getParentFile(), folderName); if(!appDir.exists()){ boolean createSuccess = appDir.mkdirs(); Toast.makeText(getContext(), createSuccess ? "创建成功" : "创建失败", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getContext(),"文件夹已存在", Toast.LENGTH_SHORT).show(); } }
如果你确实需要在公共存储目录(比如下载、文档目录)下创建文件夹,使用MediaStore或者存储访问框架(SAF)实现即可,不需要申请旧版存储权限。
内容的提问来源于stack exchange,提问作者Android4Ever
相关产品推荐
相关产品推荐

