我想将图像文件转换为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
}
通过上述方法,我得到了真正的路径
存储/模拟/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 返回 null 的原因与我猜的相同。
我从几个堆栈溢出最佳解决方案的答案中找到了上述方法。但这对我不起作用。
我其实不明白我的文件路径是错误的?或 base64 的对话技术。
请帮我找到最好的解决方案。
谢谢你。