【问题标题】:getData() is not working since migration to kotlin自迁移到 kotlin 后,getData() 无法正常工作
【发布时间】:2020-07-27 06:11:43
【问题描述】:

我是 kotlin 的新手。我编写了这段代码,它将从图像选择器中获取图像。 但我在网上遇到错误:val filePath: Uri = attr.data.getData() 错误:未解决的参考。 kotlin 是否有任何变化,因为这段代码在 java 中工作正常(意味着我迁移到了 kotlin)

imageStore(bitmap) 的另一个错误错误:无法智能转换为位图。

我已经搜索了文档,但无法解决这 2 个问题。

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK && requestCode == 1) {
        val filePath: Uri = attr.data.getData()

        try {
            val inputStream: InputStream? = contentResolver.openInputStream(filePath)
            bitmap = BitmapFactory.decodeStream(inputStream)
            imageStore(bitmap)
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        }
    }
}

【问题讨论】:

  • 请在存在问题的地方发布您的 logcat 跟踪
  • @Quicklearner 我还没有运行代码。错误出现在 IDE 中(文本和工具提示下的红线,即建议(上下文操作))
  • @techfangirl 如果我的回答解决了您的所有问题,请将其标记为答案

标签: android kotlin migration uri


【解决方案1】:

但是我在 line:val filePath: Uri = attr.data.getData() error: Unresolved reference 遇到错误

嗯,这意味着编译器无法理解您所指的内容。这样说对吗?

好吧,考虑到您没有任何名为 attr 的对象,编译器似乎是正确的。

这意味着您应该删除 attr 部分,例如:

val filePath: Uri = data?.getData() ?: return

如果 Intent 中的数据为 null,则此处的 return 将停止执行其余的方法

要解决你的第二个问题,你需要这样的东西:

bitmap?.let { bitmapInstance ->
   imageStore(bitmapInstance)  
 }

这是做什么的?

嗯,它使您可以线程安全地访问位图对象,并确保实例不为空。

【讨论】:

  • 正如我提到的,我几个月前在 java 中编写了这个代码,现在我只使用了 android studio 的“迁移到 kotlin”功能。代码(迁移前)正常工作,没有错误
  • 是的,迁移工具并不完美,我试图通过解释Unresolved reference 的含义@techfangirl 来教你如何解决这些问题:)
【解决方案2】:

将此行val filePath: Uri = attr.data.getData() 替换为

 val filePath: Uri = data!!.getData()!!

更新代码

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK && requestCode == 1) {
        val filePath: Uri = data!!.getData()!!

        try {
            val inputStream: InputStream? = contentResolver.openInputStream(filePath)
            var bitmap = BitmapFactory.decodeStream(inputStream)
            imageStore(bitmap)
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        }
    }
}

【讨论】:

  • 类型不匹配:必需的 Uri
【解决方案3】:

正如@a_local_nobody 所说的“迁移工具并不完美”,我学习了 kotlin 的基础知识,发现以下代码对我来说很好。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == 1 && resultCode == Activity.RESULT_OK && data != null) {
        val filePath = data.data
        try {
            val inputStream = contentResolver.openInputStream(filePath!!)
            bitmap = BitmapFactory.decodeStream(inputStream)
            imageView!!.setImageBitmap(bitmap)
            imageStore(bitmap)
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        }
    }
    super.onActivityResult(requestCode, resultCode, data)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2013-07-07
    • 2019-04-24
    相关资源
    最近更新 更多