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模拟器默认可能没有配置足够的外部存储空间,或者存储挂载异常。你可以:- 进入模拟器的「设置」-「存储」,查看外部存储是否正常挂载、有可用空间
- 在AVD管理器中编辑该模拟器,调整「Internal Storage」或「SD Card」的大小,重启模拟器后再测试
备选方案:使用应用专属外部存储
如果公共Documents目录的问题始终无法解决,可以先尝试应用专属的外部存储目录(API19+无需额外权限),路径为context.getExternalFilesDir(null),把日志文件存在这里测试,如果能正常创建,说明是公共目录的权限或路径问题,再针对性排查。
另外,你可以打印documents.absolutePath查看模拟器上的实际路径,确认是否和预期一致,有时候模拟器的存储路径会有细微差异。
备注:内容来源于stack exchange,提问作者Androidew1267

