像素复制崩溃:窗口没有背衬表面

问题描述 投票:0回答:0

我正在尝试获取窗口的屏幕截图,基本上是位图。我还需要从加速硬件设备获取屏幕截图。

我已经实现了 PixelCopy API,如下所示:

PixelCopyUtils

@RequiresApi(Build.VERSION_CODES.O)
object PixelCopyUtils {

    fun getViewBitmap(window: Window, event: (PixelCopyEvents) -> Unit) {
        val bitmap = Bitmap.createBitmap(window.decorView.rootView.width, window.decorView.rootView.height, Bitmap.Config.ARGB_8888)
        val handlerThread = HandlerThread(PixelCopyUtils::class.java.simpleName)
        handlerThread.start()

        PixelCopy.request(window, bitmap, { copyResult ->
            if (copyResult == PixelCopy.SUCCESS) {
                event(PixelCopyEvents.OnCopySuccess(bitmap))
            } else {
                event(PixelCopyEvents.OnCopyError)
            }
            handlerThread.quitSafely()
        }, Handler(handlerThread.looper))

    }
    sealed interface PixelCopyEvents {
        object OnCopyError: PixelCopyEvents
        data class OnCopySuccess(val bitmap: Bitmap): PixelCopyEvents
    }
}

从窗口调用的扩展函数,我想从中获取位图

@RequiresApi(Build.VERSION_CODES.O)
fun Window.onViewDraw(isReady: (Bitmap?) -> Unit) {
    this.decorView.rootView.post {
        PixelCopyUtils.getViewBitmap(this) { event ->
            when(event) {
                PixelCopyUtils.PixelCopyEvents.OnCopyError -> {
                    logging(TAG, "Error while getting the screenshot through PixelCopy API.")
                    isReady(null)
                }
                is PixelCopyUtils.PixelCopyEvents.OnCopySuccess -> {
                    isReady(event.bitmap)
                }
            }
        }
    }
}

它工作了很多次,但我有时会遇到以下崩溃:

Exception java.lang.IllegalArgumentException: Window doesn't have a backing surface!
at android.view.PixelCopy.request (PixelCopy.java:278)
at android.view.PixelCopy.request (PixelCopy.java:223)
at android.os.Handler.handleCallback (Handler.java:883)
at android.os.Handler.dispatchMessage (Handler.java:100)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:8167)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100)

我不知道如果在绘制视图后触发 PixelCopy ,为什么会发生这种行为。 预先感谢。

android kotlin bitmap android-pixel-copy
© www.soinside.com 2019 - 2024. All rights reserved.