我正在尝试获取窗口的屏幕截图,基本上是位图。我还需要从加速硬件设备获取屏幕截图。
我已经实现了 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 ,为什么会发生这种行为。 预先感谢。