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

Android通过Intent保存写文本文件时出现No content provider的IOException

问题解决方法

根因分析

你的代码核心错误出在onActivityResult回调的Uri获取逻辑:ACTION_CREATE_DOCUMENT返回的文件Uri存储在返回Intent的data字段中,你直接把整个Intent对象转字符串解析,得到的不是合法的文件访问Uri,因此触发了No content provider异常。同时写入完成后没有主动关闭输出流,会导致内容没有被真正刷入文件,就算文件创建成功也会是空内容。

修正后的代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_extra)
    
    buttonFiles.setOnClickListener{
        val intent = Intent()
            .addCategory(Intent.CATEGORY_OPENABLE)
            .setType("text/plain")
            .putExtra(Intent.EXTRA_TITLE, "testFileSam.txt")
            .setAction(Intent.ACTION_CREATE_DOCUMENT)
        startActivityForResult(Intent.createChooser(intent, "text file"), 1)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == 1 && resultCode == RESULT_OK) {
        // 修正点1:正确从返回的Intent中提取文件Uri
        val fileUri = data?.data ?: return
        try{
            // 修正点2:用Kotlin use扩展自动管理输出流,自动完成关闭、刷入操作,避免资源泄漏
            contentResolver.openOutputStream(fileUri)?.use { outputStream ->
                outputStream.write("Hello, is anybody out there!!!".toByteArray(Charsets.UTF_8))
            }
        }catch( e: IOException){
            Log.d("Debug"," IOException = " + e.message)
        }
    }
}

后续开发注意事项

  • 后续实现wav音频文件写入时,仅需要将Intent的setType参数修改为audio/wav即可,写入逻辑通用
  • 如果项目依赖AndroidX,推荐使用官方更稳定的Activity Result API替代已废弃的startActivityForResult方法,逻辑可维护性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:15:03