Android 使用 Intent 保存和写入文本文件,得到 IOException “No content provider”
Posted
技术标签:
【中文标题】Android 使用 Intent 保存和写入文本文件,得到 IOException “No content provider”【英文标题】:Android Save and Write Text File with Intent, getting IOException "No content provider" 【发布时间】:2021-12-01 09:35:03 【问题描述】:当我尝试将内容写入使用 Intent 创建的文件时出现异常。
错误是 IOException 错误
“没有内容提供者:Intent ...”。
我看到在“我的云端硬盘”中创建的文件,但它没有内容。
我想将文本输出到文本文件。这是朝着将数据输出到音频 wav 文件的方向迈出的一步。
我基本上是在做这个教程,除了我使用的是 Kotlin: https://www.youtube.com/watch?v=CGD1Kr7A77Y&ab_channel=Sam%27sandroidClas-s-room
代码位于活动文件中。 “buttonFiles”是我要添加 Click Listerner 的按钮。
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)
var uri = data
try
if(uri != null)
var outputStream = contentResolver.openOutputStream(Uri.parse(uri.toString()))
val charset = Charsets.UTF_8
outputStream?.write("Hello, is anybody out there!!!".toByteArray(charset))
catch( e: IOException)
Log.d("Debug"," IOException = " + e.message)
【问题讨论】:
首先将Uri.parse(uri.toString())
替换为uri
。然后,如果您仍然遇到问题,您可能需要编辑您的问题并发布完整的堆栈跟踪。
@CommonsWare 谢谢。它认为这是类型不匹配。编译错误为“类型不匹配:推断类型为 Intent 但预期为 Uri”。
【参考方案1】:
var uri = data
data
是一个Intent?
。您将它分配给一个名为 uri
的变量,这让我们俩都感到困惑。
将其更改为:
val uri = data?.data
现在,uri
将成为 Uri?
。您可以将其与 null
支票一起使用。而且,从那里,您可以使用contentResolver.openOutputStream(uri.toString())
打开OutputStream
。
这也是您最初遇到问题的原因。您创建了 Intent
的字符串表示,然后尝试将其解析为 Uri
,但这是行不通的。
【讨论】:
是的,我对在 Android 上使用 Kotlin 和编程还是很陌生。它现在执行 outputStream 代码,但由于某种原因,文件中没有内容。我也很好奇为什么文件没有被覆盖。我在 MyDrive 中有几个 testFileSam.txt 文件。 @JohnAlway:“由于某种原因,文件中没有内容”——您没有刷新和关闭流。 “我也很好奇为什么文件没有被覆盖。我在 MyDrive 中有几个 testFileSam.txt 文件”——你确定它们都具有相同的名称吗?另外,什么是“MyDrive”? @CommonWare -- 在 Android 模拟器上,我转到“设置->存储->SDCARD->(左上角菜单栏)->文件->驱动器->我的驱动器”。在该文件夹中,我看到每个创建的“testFileSam.txt”,都没有内容。 我可以通过点击应用程序“Drive”然后转到“MyDrive”来更快地到达那里。 @JohnAlway:您似乎将内容存储在 Google Drive 中。我无法评论为什么 Google Drive 会这样。以上是关于Android 使用 Intent 保存和写入文本文件,得到 IOException “No content provider”的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上使用 Kotlin 共享 Intent 文本