1

我想将图像文件转换为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 的对话技术。

请帮我找到最好的解决方案。

谢谢你。

4

2 回答 2

2
  fun convertToBase64(imageUri: Uri):

 var is: InputStream  

  is = contentresolver.openinputstream(imageUri)

使用就像fis。

打电话给;

... = convertToBase64(data.data)

还是data.string?

不要乱用诸如 get real parh from uri 之类的功能。把它们丢掉。

于 2021-03-03T09:49:58.137 回答
-2

第一个抛出 FileNotFound 因为你没有得到它。文件必须与路径和文件名分开。希望这个可以帮助你:类似的

于 2021-03-03T09:39:49.977 回答