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

使用ActivityResultContracts.CreateDocument()创建文件时如何固定文件类型

实现方案

你可以通过显式指定文件MIME类型的方式固定文件类型,仅允许用户修改文件名部分,调整后的代码如下:

步骤1:修改注册逻辑,给CreateDocument传入目标MIME类型

private val getContent = registerForActivityResult(ActivityResultContracts.CreateDocument("text/csv")) { uri ->
    uri?.let { 
        // 可选追加后缀校验,避免极端场景下系统限制失效
        if (checkCsvSuffix(it)) {
            writeToFile(requireActivity(), it)
        } else {
            Toast.makeText(requireContext(), "仅支持保存为csv格式文件", Toast.LENGTH_SHORT).show()
        }
    }
}

步骤2:启动调用逻辑保持不变

getContent.launch("file.csv")

补充说明

  • 原生Android及大部分主流ROM在接收到指定的MIME类型后,会自动锁定文件后缀,用户在文件选择器中仅能修改文件名前缀,无法切换其他文件类型,系统会自动为用户输入的文件名补充.csv后缀
  • 上述代码中追加的后缀校验方法可以进一步强校验文件格式,参考实现如下:
private fun checkCsvSuffix(uri: Uri): Boolean {
    val fileName = runCatching {
        DocumentsContract.getDocumentId(uri).split(":").last()
    }.getOrNull() ?: requireContext().contentResolver.query(uri, null, null, null, null)?.use { cursor ->
        val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        cursor.moveToFirst()
        cursor.getString(nameIndex)
    }
    return fileName?.endsWith(".csv", ignoreCase = true) == true
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:24:04