You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 9(API28)模拟器中无法在Documents文件夹创建日志文件的问题求助

Android 9(API28)模拟器中无法在Documents文件夹创建日志文件的问题求助

看起来你在Android 9模拟器上遇到了Treessence库创建日志文件时的路径权限问题,我来帮你梳理下可能的原因和解决办法:

问题根源分析

Android 9(API28)还没启用分区存储,但外部存储的权限校验和路径处理逻辑和Android13有差异,再加上模拟器可能存在的存储模拟配置问题,导致mkdirs()没有正确创建Documents目录,进而创建锁文件(.lck)时抛出NoSuchFileException。

具体解决步骤

  • 确认权限配置与动态申请
    首先在AndroidManifest.xml中添加必要的存储权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    注意API28及以下不需要MANAGE_EXTERNAL_STORAGE权限,但必须在运行时动态申请WRITE_EXTERNAL_STORAGE权限,比如在Activity中添加:

    private val REQUEST_STORAGE_PERMISSION = 1001
    
    // 在合适的时机(比如启动时)调用
    fun requestStoragePermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                REQUEST_STORAGE_PERMISSION
            )
        }
    }
    

    一定要等权限申请通过后再初始化日志树。

  • 修复Documents目录的创建逻辑
    你当前的目录创建代码没有检查mkdirs()的返回结果,建议显式校验并确保目录存在:

    private val documents = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
    
    fun start() {
        // 先确保Documents目录存在
        if (!documents.exists()) {
            val isCreated = documents.mkdirs()
            if (!isCreated) {
                Timber.e("Failed to create Documents directory")
                return
            }
        }
    
        val fileName = "${currentDate()}.log"
        val tree = FileLoggerTree.Builder()
            .withFileName(fileName)
            .withDir(documents)
            .appendToFile(true)
            .build()
    
        Timber.plant(tree)
    }
    

    这样能避免因为目录创建失败,后续创建日志文件和锁文件时出错。

  • 检查模拟器的外部存储配置
    有些Android9模拟器默认可能没有配置足够的外部存储空间,或者存储挂载异常。你可以:

    1. 进入模拟器的「设置」-「存储」,查看外部存储是否正常挂载、有可用空间
    2. 在AVD管理器中编辑该模拟器,调整「Internal Storage」或「SD Card」的大小,重启模拟器后再测试
  • 备选方案:使用应用专属外部存储
    如果公共Documents目录的问题始终无法解决,可以先尝试应用专属的外部存储目录(API19+无需额外权限),路径为context.getExternalFilesDir(null),把日志文件存在这里测试,如果能正常创建,说明是公共目录的权限或路径问题,再针对性排查。

另外,你可以打印documents.absolutePath查看模拟器上的实际路径,确认是否和预期一致,有时候模拟器的存储路径会有细微差异。

备注:内容来源于stack exchange,提问作者Androidew1267

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:39:32