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

Android Studio Kotlin文件读取实现求助:匹配现有写入接口

实现readFile函数

以下是匹配你现有writeFile逻辑的readFile函数,可通过readFile("Filename as String")调用,返回文件内容字符串:

fun readFile(name: String): String? {
    val extVolumeUri: Uri = MediaStore.Files.getContentUri("external")
    // 与writeFile保持一致的查询条件
    val selection = "${MediaStore.MediaColumns.DISPLAY_NAME} = ? AND ${MediaStore.MediaColumns.MIME_TYPE} = ?"
    val selectionArgs = arrayOf(name, "text/plain")

    var fileUri: Uri? = null
    contentResolver.query(
        extVolumeUri,
        arrayOf(MediaStore.MediaColumns._ID), // 仅查询ID字段,提升效率
        selection,
        selectionArgs,
        null
    )?.use { cursor ->
        if (cursor.moveToFirst()) {
            val idIndex = cursor.getColumnIndex(MediaStore.MediaColumns._ID)
            if (idIndex != -1) {
                val id = cursor.getLong(idIndex)
                fileUri = ContentUris.withAppendedId(extVolumeUri, id)
            }
        }
    }

    fileUri ?: return null // 文件不存在时返回null

    return try {
        contentResolver.openInputStream(fileUri)?.bufferedReader()?.use { reader ->
            reader.readText()
        }
    } catch (e: IOException) {
        e.printStackTrace()
        null
    }
}

关键细节说明

  • 查询逻辑对齐:复用writeFile的文件名+MIME类型查询条件,确保定位到的是你之前写入的目标文件
  • 资源自动管理:用use函数自动关闭Cursor和InputStream,无需手动调用close,避免资源泄漏
  • 异常处理:捕获IO异常并打印日志,避免程序崩溃,同时返回null标记读取失败
  • 性能优化:仅查询_ID字段,减少不必要的数据读取

权限注意

  • Android 10(API 29)及以上:无需申请READ_EXTERNAL_STORAGE权限,因为读取的是自身通过MediaStore创建的文件
  • Android 9及以下:需在Manifest中添加<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>并动态申请权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:10:33