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

