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

Android Kotlin读取DCIM目录temp.txt文件失败问题排查

解决Android Kotlin读取DCIM目录temp.txt为空及资源未关闭问题

1. 权限问题:动态权限申请缺失

你添加的READ_EXTERNAL_STORAGE静态权限仅适用于API 23以下系统,API 23到28之间必须动态申请权限,否则系统会直接拒绝外部存储访问请求。

动态权限申请实现

在MainActivity中加入权限检查与申请逻辑:

private val REQUEST_READ_STORAGE = 1001

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
            REQUEST_READ_STORAGE
        )
    } else {
        // 权限已授予,执行文件读取
        readTempFile()
    }
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_READ_STORAGE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            readTempFile()
        } else {
            Toast.makeText(this, "需要存储权限才能读取文件", Toast.LENGTH_SHORT).show()
        }
    }
}

2. 文件读取:未正确关闭资源导致的异常

警告W/System: A resource failed to call close.说明你读取文件时未关闭输入流,这会造成资源泄漏,甚至导致文件读取不完整或为空。Kotlin推荐使用use扩展函数自动管理资源,它会在代码块执行完毕后自动关闭流。

正确的文件读取实现

private fun readTempFile() {
    val dcimDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
    val tempFile = File(dcimDir, "temp.txt")

    // 先验证文件存在性
    if (!tempFile.exists()) {
        Log.e("FileError", "temp.txt不存在")
        return
    }

    // 使用use自动关闭资源
    val content = tempFile.bufferedReader().use { it.readText() }
    Log.d("FileContent", "String1: $content")
}

3. 路径正确性验证

禁止硬编码DCIM路径,务必使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)获取系统标准的DCIM目录路径——不同设备的DCIM路径可能存在差异,硬编码会导致文件找不到。

额外排查点

  • 确认temp.txt确实在系统公共DCIM目录下,而非应用私有存储的DCIM子目录
  • 若测试设备为API 29及以上,READ_EXTERNAL_STORAGE权限已被废弃,需使用MANAGE_EXTERNAL_STORAGE权限或改用媒体库API访问文件(不过你的权限设置了maxSdkVersion="28",针对23-28设备无需考虑此点)

内容的提问来源于stack exchange,提问作者dip deb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:42:27