当前位置: 首页 > 知识库问答 >
问题:

无法从意图onActivityResult获取文件uri

洪高阳
2023-03-14

我想从OnActivityResult接收正常文件路径,如下所示:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK) {
            Log.i("m", data!!.dataString!!)
            convertFileToString(data.dataString!!)

        }
    }
java.io.FileNotFoundException: File 'content:/com.android.providers.media.documents/document/image%3A18' does not exist
try {
val data = FileUtils.readFileToByteArray(file) // this line

} catch (e: IOException) {
e.printStackTrace()
}

这个文件也存在,但我不能得到它。我在这里看到了一些建议获得real路径的问题,如下所示:

fun getPath(context:Context, uri:Uri):String {
  val result:String = null
  val proj = arrayOf<String>(MediaStore.Images.Media.DATA)
  val cursor = context.getContentResolver().query(uri, proj, null, null, null)
  if (cursor != null)
  {
    if (cursor.moveToFirst())
    {
      val column_index = cursor.getColumnIndexOrThrow(proj[0])
      result = cursor.getString(column_index)
    }
    cursor.close()
  }
  if (result == null)
  {
    result = "Not found"
  }
  return result
}

但此方法返回以下异常:

java.io.FileNotFoundException: File 'Not found' does not exist

因此,我在这里收到的data!!.datastring!!:

content://com.android.providers.media.documents/document/image%3A18
/document/image:18

如何将文件转换为字符串:

fun convertFileToString(path: String) {
        //dialog.dismiss()
        val file = File(path)

        for (i in 0 until sn.array!!.size()) {
            val jsonObj = sn.array!![i].asJsonObject
            val nFile = jsonObj.get("filename").asString

            if (file.name == nFile) {
                Toast.makeText(this, R.string.message_about_attached__file, Toast.LENGTH_SHORT).show()
                return
            }
        }

        try {
            val data = FileUtils.readFileToByteArray(file)
            uploadFiles(File(path).name, Base64.encodeToString(data, Base64.NO_WRAP))
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

共有1个答案

蓝华皓
2023-03-14

我想从onActivityResult接收正常文件路径,如下所示:

我猜测您使用的是action_open_document,或者action_get_content。您将获得一个contentURI,这正是那些intent操作文档中要返回的内容。这样的URI可能由以下人员支持:

  • 外部存储上的本地文件,您可能无法在Android 10+上访问
  • 其他应用程序内部存储中的本地文件
  • 可移动存储上的本地文件
  • 已加密且需要动态解密的本地文件
  • 数据库中blob列中保存的字节流
  • 互联网上需要另一个应用程序先下载的内容
  • 即时生成的内容
  • ...等等
  • 通过在上下文调用GetContentResolver()(如您的活动
  • 来获取 ContentResolver
  • 调用ContentResolver上的OpenInputStream(),传入您的URI,以获取由URI
  • 标识的内容上的 InputStream
  • InputStream调用Reader().readText()以获取表示文件内容的字符串

综合起来,应该是这样的:

val string = data.data?.let { contentResolver.openInputStream(it).use { it.reader().readText() } }
 类似资料:
  • 我知道,要放入值,我可以,要检索值,我可以,但在下面的代码中,它的行为不像预期的那样。检索值时,我获得。 设置值的代码: 并且我正在检索BroadCaseReceiver的onReceive中的值:[省略的无关代码]

  • 我需要设置/添加照片/电影作为ToDo应用程序的附件。不幸的是:onActivityResult in line super。onActivityResult(请求代码、结果代码、数据);以红色突出显示,我得到一个错误: 无法解析方法“onActivityResult(int,int,android.content.Intent)” ctivity.java

  • 我想使用共享命令从图库获取图像。 我目前的代码是: imageUri 的值为:content://media/external/images/media/37 但是函数“openInputStream”会抛出错误“java.io.FileNotFoundException”。 通过下面的函数,我得到了图像的真实路径。 但我不知道如何将其转换为位图。

  • 问题内容: 当我在eclipse中导出可执行jar文件时,也需要使用res文件夹进行编译,当我使用不起作用的方法时。 当前读取的图像代码 代码无效 问题答案: 我现在已经解决了问题-这是有效的代码 fileName的值只是一个图像名称,例如BufferedImage img = loadImage(“ background.png”); 感谢大家的帮助。

  • 问题内容: 我的目录设置如下: 我的主文件是这样的: 我的应用程序是这样的: 问题是当我运行应用程序时,无法加载CSS文件。 问题答案: 由于.css文件是静态文件,因此您必须将它们提供给客户端。但是,您不能将静态文件用作快速中间件。将以下中间件添加到您的express应用中,然后将文件夹移动到目录下(您应该创建一个) 因此您的最终目录结构应如下所示 并且不要忘记需要模块

  • 当我在eclipse中导出可执行jar文件时,我需要获取res文件夹进行编译,当我使用方法时,它不起作用。 当前读取图像代码 不起作用的代码