You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android模拟器外部存储文件夹二次创建失败问题求助

解决Android模拟器外部存储二次创建文件夹失败的问题

从你提供的调试日志来看,核心矛盾点是:目标目录不存在,但无法写入创建,且已声明WRITE_EXTERNAL_STORAGE权限。结合Android存储机制的特性,我整理了几个针对性的排查和解决方向:

1. 优先处理路径编码问题

日志里的目录URI是file:/storage/emulated/0/Notepad/Apr%203,%202018%2012:27:46%20PM,其中%20是空格的URL编码形式。直接用这种编码后的路径创建文件夹,Android文件系统可能无法识别,导致创建失败。

解决方法:先对路径进行URL解码,再执行创建操作:

import java.net.URLDecoder;

// 解码路径,去掉file://前缀
String encodedUri = "file:/storage/emulated/0/Notepad/Apr%203,%202018%2012:27:46%20PM";
String decodedPath = URLDecoder.decode(encodedUri.replace("file:/", ""), "UTF-8");
File targetFolder = new File(decodedPath);

// 使用mkdirs()创建多级目录(如果父目录Notepad不存在也能自动创建)
boolean isCreated = targetFolder.mkdirs();

2. 检查Android版本对应的存储权限逻辑

WRITE_EXTERNAL_STORAGE权限的作用在不同Android版本中有很大变化,这很可能是二次创建失败的关键:

  • Android 9及以下(API ≤28):除了在Manifest中声明权限,还需要动态申请权限(6.0及以上系统要求)。确认代码中已经通过ActivityCompat.requestPermissions()获取到用户授权,且ContextCompat.checkSelfPermission()返回PackageManager.PERMISSION_GRANTED
  • Android 10(API 29):系统引入了分区存储,即使声明了WRITE_EXTERNAL_STORAGE,默认也无法直接访问公共目录。需要在AndroidManifest.xml<application>标签中添加:
    android:requestLegacyExternalStorage="true"
    
    此属性会让应用暂时使用旧的存储访问规则。
  • Android 11及以上(API ≥30):WRITE_EXTERNAL_STORAGE权限已被废弃,无法直接创建公共目录。建议:
    • 使用应用专属外部存储getExternalFilesDir(null),这个目录属于应用私有,无需额外权限,卸载应用时会自动删除;
    • 如果必须访问公共目录,使用**存储访问框架(SAF)**让用户手动选择目录,或者通过MediaStore API创建文件夹。

3. 验证模拟器的存储状态

模拟器的外部存储可能存在挂载异常或空间不足的情况:

  • 在模拟器设置的「存储」选项中,检查存储空间是否充足;
  • 用代码判断外部存储是否处于可读写状态:
    if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        // 外部存储未挂载或不可读写,提示用户检查
        return;
    }
    

4. 检查文件夹创建逻辑的细节

确保你使用的是mkdirs()而不是mkdir()mkdir()只能创建最后一级目录,如果父目录(比如Notepad)不存在,会直接失败;而mkdirs()会自动创建所有不存在的父目录,更适合多级目录的创建场景。

内容的提问来源于stack exchange,提问作者Ahmad Sattout

火山引擎 最新活动