【问题标题】:Android Save and Write Text File with Intent, getting IOException "No content provider"Android 使用 Intent 保存和写入文本文件,得到 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%27sAndroidClassroom

代码位于活动文件中。 “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”。

标签: java android android-studio kotlin mediastore


【解决方案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 会这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2021-09-04
相关资源
最近更新 更多