从路径编码图像时找不到文件异常
File not found exception while encoding image from path
我想将图像文件转换为 base64。
我通过启动 Activity 来请求图像,意图如下
val intent = Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)
intent.type = "image/*"
在 onActivityResult 上,我正在尝试获取 Uri 结果收到的真实路径。
我遵循的一种方法如下
fun getRealPathFromUri(context: Context, contentUri: Uri?): String {
val result: String
val cursor: Cursor = contentUri?.let { context.contentResolver.query(it, null, null, null, null) }!!
cursor.moveToFirst()
val idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
result = cursor.getString(idx)
cursor.close()
return result
}
通过上述方法,我得到了真实路径
storage/emulated/0/DICM/myImagepath
这对吗?
是的,我也尝试在路径前添加 file://
它也不起作用。
我尝试的另一种方法是
fun getPath(context: Context, uri: Uri?): String? {
try {
var cursor = context.contentResolver.query(uri!!, null, null, null, null)
cursor!!.moveToFirst()
var document_id = cursor.getString(0)
document_id = document_id.substring(document_id.lastIndexOf(":") + 1)
cursor.close()
cursor = context.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, MediaStore.Images.Media._ID + " = ? ", arrayOf(document_id), null
)
cursor!!.moveToFirst()
val path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA))
cursor.close()
return path
} catch (e: Exception) {
e.printStackTrace()
return null
}
}
但这不会生成 document_id 并且不会给出真实路径,因为我的代码中可能存在一些问题。
获得真实路径后,我尝试了两种将图像转换为 base64 的解决方案
解决方案1
fun convertToBase64(imageUrl: String): String{
val imagefile = File(imageUrl)
var fis: FileInputStream? = null
try {
fis = FileInputStream(imagefile)
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
val bm = BitmapFactory.decodeStream(fis)
val baos = ByteArrayOutputStream()
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos)
val b: ByteArray = baos.toByteArray()
return encodeToString(b, Base64.DEFAULT)
}
解决方案2
fun encodeBitmapToBase64String(
image: Bitmap?,
compressFormat: CompressFormat?,
quality: Int
): String? {
val byteArrayOS = ByteArrayOutputStream()
image?.compress(compressFormat, quality, byteArrayOS)
return encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT)
}
解决方案 1 抛出 FilenotFoundexception,根据我的理解,这是因为找不到真正的路径。
解决方案 2 returns 无效,原因与我猜测的相同。
我从几个stack overflows的best solution answer中找到了上面的方法。但它对我不起作用。
我居然不明白我的文件路径错了吗?或 base64 的对话技术。
请帮助我找到最佳解决方案。
谢谢。
第一个抛出 FileNotFound,因为您无法获取它。获取文件时必须将路径和文件名分开。希望这篇能帮到你:similar one
fun convertToBase64(imageUri: Uri):
var is: InputStream
is = contentresolver.openinputstream(imageUri)
使用起来就像fis。
调用;
... = convertToBase64(data.data)
还是data.string?
不要搞乱诸如从 uri 获取真实 parh 之类的函数。扔掉它们。
我想将图像文件转换为 base64。 我通过启动 Activity 来请求图像,意图如下
val intent = Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)
intent.type = "image/*"
在 onActivityResult 上,我正在尝试获取 Uri 结果收到的真实路径。 我遵循的一种方法如下
fun getRealPathFromUri(context: Context, contentUri: Uri?): String {
val result: String
val cursor: Cursor = contentUri?.let { context.contentResolver.query(it, null, null, null, null) }!!
cursor.moveToFirst()
val idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
result = cursor.getString(idx)
cursor.close()
return result
}
通过上述方法,我得到了真实路径
storage/emulated/0/DICM/myImagepath
这对吗?
是的,我也尝试在路径前添加 file://
它也不起作用。
我尝试的另一种方法是
fun getPath(context: Context, uri: Uri?): String? {
try {
var cursor = context.contentResolver.query(uri!!, null, null, null, null)
cursor!!.moveToFirst()
var document_id = cursor.getString(0)
document_id = document_id.substring(document_id.lastIndexOf(":") + 1)
cursor.close()
cursor = context.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, MediaStore.Images.Media._ID + " = ? ", arrayOf(document_id), null
)
cursor!!.moveToFirst()
val path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA))
cursor.close()
return path
} catch (e: Exception) {
e.printStackTrace()
return null
}
}
但这不会生成 document_id 并且不会给出真实路径,因为我的代码中可能存在一些问题。
获得真实路径后,我尝试了两种将图像转换为 base64 的解决方案
解决方案1
fun convertToBase64(imageUrl: String): String{
val imagefile = File(imageUrl)
var fis: FileInputStream? = null
try {
fis = FileInputStream(imagefile)
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
val bm = BitmapFactory.decodeStream(fis)
val baos = ByteArrayOutputStream()
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos)
val b: ByteArray = baos.toByteArray()
return encodeToString(b, Base64.DEFAULT)
}
解决方案2
fun encodeBitmapToBase64String(
image: Bitmap?,
compressFormat: CompressFormat?,
quality: Int
): String? {
val byteArrayOS = ByteArrayOutputStream()
image?.compress(compressFormat, quality, byteArrayOS)
return encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT)
}
解决方案 1 抛出 FilenotFoundexception,根据我的理解,这是因为找不到真正的路径。
解决方案 2 returns 无效,原因与我猜测的相同。
我从几个stack overflows的best solution answer中找到了上面的方法。但它对我不起作用。
我居然不明白我的文件路径错了吗?或 base64 的对话技术。
请帮助我找到最佳解决方案。
谢谢。
第一个抛出 FileNotFound,因为您无法获取它。获取文件时必须将路径和文件名分开。希望这篇能帮到你:similar one
fun convertToBase64(imageUri: Uri):
var is: InputStream
is = contentresolver.openinputstream(imageUri)
使用起来就像fis。
调用;
... = convertToBase64(data.data)
还是data.string?
不要搞乱诸如从 uri 获取真实 parh 之类的函数。扔掉它们。