Android ImageReader.getPlanes()返回异常:RGBA覆盖BLOB格式缓冲区应具有高度==宽度

Android ImageReader.getPlanes()返回异常:RGBA覆盖BLOB格式缓冲区应具有高度==宽度,android,Android,我正在使用ImageReader从服务中获取Android设备的屏幕截图。 但是imageReader.planes返回AndroidMediaUtils:RGBA override BLOB格式缓冲区应具有高度==宽度 我的代码: fun takeScreen() : ByteArray? { var result = byteArrayOf() val display = (getSystemService(Context.WINDOW_SERVICE) as WindowM

我正在使用ImageReader从服务中获取Android设备的屏幕截图。 但是imageReader.planes返回AndroidMediaUtils:RGBA override BLOB格式缓冲区应具有高度==宽度

我的代码:

fun takeScreen() : ByteArray? {
    var result = byteArrayOf()
    val display = (getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
    mediaProjection.registerCallback(object : MediaProjection.Callback() {}, null)

    val imageReader = ImageReader.newInstance(
        display.width, display.height,
        ImageFormat.JPEG, 2
    )

    val metrics = DisplayMetrics()
    display.getMetrics(metrics)

    val flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY or DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC

    mediaProjection.createVirtualDisplay( "vd", display.width, display.height, metrics.densityDpi, flags, imageReader.surface, null, null)

    imageReader.setOnImageAvailableListener({
        val image = it.acquireLatestImage()
        if (image != null) {
            val planes: Array<Image.Plane> = image.planes
            val buffer = planes[0].buffer
            val pixelStride: Int = planes[0].pixelStride
            val rowStride = planes[0].rowStride
            val rowPadding: Int = rowStride - pixelStride * it.width

            val bitmap = Bitmap.createBitmap(
                it.width + rowPadding / pixelStride,
                it.height, Bitmap.Config.ARGB_8888
            )

            bitmap.copyPixelsFromBuffer(buffer)
            val stream = ByteArrayOutputStream()
            bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream)
            result = stream.toByteArray()
        }
    }, null)
    return result
}
fun takeScreen():ByteArray?{
var result=byteArrayOf()
val display=(作为WindowManager的getSystemService(Context.WINDOW\u服务)。defaultDisplay
mediaProjection.registerCallback(对象:mediaProjection.Callback(){},null)
val imageReader=imageReader.newInstance(
display.width,display.height,
ImageFormat.JPEG,2
)
val metrics=DisplayMetrics()
display.getMetrics(度量)
val flags=DisplayManager.VIRTUAL\u DISPLAY\u FLAG\u OWN\u CONTENT\u ONLY或DisplayManager.VIRTUAL\u DISPLAY\u FLAG\u PUBLIC
mediaProjection.createVirtualDisplay(“vd”、display.width、display.height、metrics.densityDpi、flags、imageReader.surface、null、null)
imageReader.setOnImageAvailableListener({
val image=it.acquireLatestImage()
如果(图像!=null){
val平面:数组=image.planes
val buffer=平面[0]。缓冲区
val pixelStride:Int=平面[0]。pixelStride
val rowStride=平面[0]。rowStride
val rowPadding:Int=rowStride-pixelStride*it.width
val bitmap=bitmap.createBitmap(
it.width+行填充/像素步长,
it.height,Bitmap.Config.ARGB_8888
)
位图.copyPixelsFromBuffer(缓冲区)
val stream=ByteArrayOutputStream()
bitmap.compress(bitmap.CompressFormat.JPEG,50,流)
结果=stream.toByteArray()
}
},空)
返回结果
}

有什么问题吗?

我通过将ImageFormat.JPEG更改为PixelFormat.RGBA_8888解决了问题。

我通过将ImageFormat.JPEG更改为PixelFormat.RGBA_8888解决了问题。

这应该被接受为解决了实际问题的答案