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

