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应用程序[重复]

在 Android 上使用 Kotlin 共享 Intent 文本

Android:如何保存数据(Intent's Data)

将数据保存到电子邮件中:

如何使用Android Intent System在whatsapp上分享最少n人的文本

Android - 通过 Intent 拍摄照片并使用自定义名称将它们保存到自定义目的地