无法从intent-onactivityresult获取文件uri

pvabu6sv  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(303)

我想从接收正常的文件路径 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

我在这里得到了什么 Log.i("m",uri.path.toString()) :

/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()
        }
    }
vs91vp4v

vs91vp4v1#

我想从onactivityresult接收正常的文件路径,如下所示:
我猜你在用 ACTION_OPEN_DOCUMENT ,或者 ACTION_GET_CONTENT . 你得到了一个
content Uri ,这正是那些 Intent 记录了返回的操作。这样的 Uri 可能有以下支持:
外部存储器上的本地文件,在android 10上可能无法访问+
其他应用程序的内部存储上的本地文件
可移动存储上的本地文件
加密并需要动态解密的本地文件
存储在数据库中的字节流 BLOB 数据库中的列
互联网上需要其他应用程序先下载的内容
动态生成的内容
……等等
此异常来自将文件转换为字符串的方法
我假设“将我的文件转换为字符串”,您的意思是将文件内容作为 String . 在这种情况下:
得到一个 ContentResolver 通过呼叫 getContentResolver()Context ,例如 Activity 呼叫 openInputStream()ContentResolver ,传递你的 Uri ,以获得 InputStream 关于 Uri 呼叫 reader().readText()InputStream 得到一个 String 表示文件内容
综合起来,应该是这样的:

val string = data.data?.let { contentResolver.openInputStream(it).use { it.reader().readText() } }

相关问题