无法从意图 onActivityResult 获取文件 uri
Can't get file uri from intent onActivityResult
我想从 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
}
但是这个方法return这样的异常:
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()
}
}
I would like to receive normal file path from onActivityResult like this:
我猜你正在使用 ACTION_OPEN_DOCUMENT
,或者可能是 ACTION_GET_CONTENT
。您将得到一个 content
Uri
,这正是那些 Intent
操作记录在 return 中的内容。这样的 Uri
可能得到以下支持:
- 外部存储上的本地文件,您可能无法在 Android 10+
上访问
- 另一个应用程序的内部存储上的本地文件
- 可移动存储上的本地文件
- 本地加密文件,需要即时解密
- 数据库中
BLOB
列中保存的字节流
- 网上一段内容,需要其他app先下载
- 即时生成的内容
- ...等等
this exception comes from method which converts my file to string
我假设 "converts my file to string" 是指将文件内容读取为 String
。在那种情况下:
- 通过在
Context
上调用 getContentResolver()
获得 ContentResolver
,例如您的 Activity
- 在
ContentResolver
上调用 openInputStream()
,传入您的 Uri
,以获得 Uri
[=52 所标识内容的 InputStream
=]
- 在
InputStream
上调用 reader().readText()
以获得表示文件内容的 String
结合起来,应该是这样的:
val string = data.data?.let { contentResolver.openInputStream(it).use { it.reader().readText() } }
我想从 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
}
但是这个方法return这样的异常:
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()
}
}
I would like to receive normal file path from onActivityResult like this:
我猜你正在使用 ACTION_OPEN_DOCUMENT
,或者可能是 ACTION_GET_CONTENT
。您将得到一个 content
Uri
,这正是那些 Intent
操作记录在 return 中的内容。这样的 Uri
可能得到以下支持:
- 外部存储上的本地文件,您可能无法在 Android 10+ 上访问
- 另一个应用程序的内部存储上的本地文件
- 可移动存储上的本地文件
- 本地加密文件,需要即时解密
- 数据库中
BLOB
列中保存的字节流 - 网上一段内容,需要其他app先下载
- 即时生成的内容
- ...等等
this exception comes from method which converts my file to string
我假设 "converts my file to string" 是指将文件内容读取为 String
。在那种情况下:
- 通过在
Context
上调用getContentResolver()
获得ContentResolver
,例如您的Activity
- 在
ContentResolver
上调用openInputStream()
,传入您的Uri
,以获得Uri
[=52 所标识内容的InputStream
=] - 在
InputStream
上调用reader().readText()
以获得表示文件内容的String
结合起来,应该是这样的:
val string = data.data?.let { contentResolver.openInputStream(it).use { it.reader().readText() } }