Как преобразовать растровое изображение в Uri, используя MediaColumns # IS_PENDING? - PullRequest
0 голосов
/ 09 января 2020

Я использую следующий код для преобразования растрового изображения в Uri:

fun convertBitmapToUri(context: Context, bitmap: Bitmap): Uri {
    val bytes = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
    val path = MediaStore.Images.Media.insertImage(context.contentResolver, bitmap, "Title", null)
    return Uri.parse(path)
}

Этот код работает нормально. Но после обновления версии SDK до 29 метод insertImage устарел. И когда я проверил do c, я увидел это утверждение:

Этот метод устарел на уровне API 29. вставка изображений должна выполняться с использованием MediaColumns # IS_PENDING, который предлагает более полный контроль над жизненным циклом.

Итак, как я могу преобразовать растровое изображение в Uri, используя этот MediaColumns#IS_PENDING?

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Вот ваш код для получения bimpa для URI

private fun saveImage(myBitmap : Bitmap) : String {

    val bytes = ByteArrayOutputStream()
    myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)

    val folder = File(Environment.getExternalStorageDirectory().absolutePath + "/" + ".yourFolder")
    // have the object build the directory structure, if needed.
    if (!folder .exists()) {
        folder .mkdirs()
    }

    try {
        val f = File(folder , "image_name.jpg")
        f.createNewFile()
        val fo = FileOutputStream(f)
        fo.write(bytes.toByteArray())
        MediaScannerConnection.scanFile(this, arrayOf(f.path), arrayOf("image/*"), { path, uri -> 
            val _uri = uri // Here is your URI from bitmap
            val _path = path // In case if you want path of that bitmp in storage
        })
        fo.close()

        return f.absolutePath
    } catch (e1 : IOException) {
        e1.printStackTrace()
    }

    return ""
}
0 голосов
/ 09 января 2020

Попробуйте приведенный ниже фрагмент кода:

Этот метод может помочь вам получить Uri из растрового изображения без использования дополнительной памяти.

 private fun convertToUri(mBitmap: Bitmap): Uri? {
    var uri: Uri? = null
    try {
        val options: BitmapFactory.Options = BitmapFactory.Options()
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, 100, 100)

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false
        val newBitmap = Bitmap.createScaledBitmap(
            mBitmap, 200, 200,
            true
        )
        val file = File(
            this.filesDir, "Image"
                    + Random().nextInt() + ".jpeg"
        )
        val out = this.openFileOutput(
            file.name,
            Context.MODE_WORLD_READABLE
        )
        newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
        out.flush()
        out.close()
        //get absolute path
        val realPath = file.absolutePath
        val f = File(realPath)
        uri = Uri.fromFile(f)

    } catch (e: Exception) {

    }
    return uri
}

fun calculateInSampleSize(
    options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int
): Int {
    // Raw height and width of image
    val height = options.outHeight
    val width = options.outWidth
    var inSampleSize = 1

    if (height > reqHeight || width > reqWidth) {

        val halfHeight = height / 2
        val halfWidth = width / 2

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
            && (halfWidth / inSampleSize) >= reqWidth
        ) {
            inSampleSize *= 2
        }
    }

    return inSampleSize
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...