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
相关产品推荐
相关产品推荐

