从路径编码图像时找不到文件异常

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 之类的函数。扔掉它们。