我想从接收正常的文件路径 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()
}
}
1条答案
按热度按时间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
表示文件内容综合起来,应该是这样的: