You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 10+ Kotlin编程实现截图的最佳方案是什么?

Android 10及以上版本截图方案选型结论

针对Android 10(API 29)及更高版本设备,编程实现截图功能优先选择PixelCopy API,不建议继续使用老旧的Canvas + drawingCache方案。

  • 旧方案的核心问题:drawingCache依赖View的软件渲染缓存实现截图,从Android 9开始系统默认全局开启硬件加速,SurfaceView、TextureView承载的视频流、相机预览、动态WebView等内容不会同步到软件渲染层,使用该方案极易出现截图纯黑、内容缺失、色块异常的问题,且相关API早已被官方标记为废弃,没有后续兼容维护。
  • PixelCopy方案的适配优势:该API是Android官方专门为屏幕内容拷贝设计的系统接口,到Android 10版本已经完全成熟,支持对整个窗口、指定View、独立Surface的内容捕获,可以正确读取硬件加速渲染的所有图层内容,不会出现黑块问题,截图的色彩准确度、清晰度都明显优于旧方案;同时接口本身是异步执行逻辑,不会阻塞主线程造成卡顿。

实际使用注意事项

  • 如果只需要实现应用内页面/控件截图,直接调用PixelCopy即可,不需要额外申请权限,传入目标窗口/View对应的Surface、输出位图、结果回调就能完成截图,还支持自定义裁剪区域,避免误截状态栏、导航栏。
  • 如果需要实现全局截图(捕获应用外的屏幕内容),不能直接调用PixelCopy,必须先通过MediaProjection API申请用户授权的屏幕捕获权限,拿到系统返回的屏幕Surface后,再配合PixelCopy完成内容拷贝,这是Android 10+版本全局截图的唯一合规实现路径,不存在绕过权限的实现方式。

核心实现参考(Kotlin)

// 截取当前Activity全窗口内容的最简实现
fun captureWindow(activity: Activity, onResult: (Bitmap?) -> Unit) {
    val decorView = activity.window.decorView
    val outputBitmap = Bitmap.createBitmap(
        decorView.width,
        decorView.height,
        Bitmap.Config.ARGB_8888
    )
    PixelCopy.request(
        activity.window,
        outputBitmap,
        { resultCode ->
            onResult(if (resultCode == PixelCopy.SUCCESS) outputBitmap else null)
        },
        Handler(Looper.getMainLooper())
    )
}

如果只需要截取某个指定控件,只需要把接口的第一个入参替换为控件对应的Surface,同时传入控件在窗口中的位置裁剪即可,逻辑比旧方案手动遍历绘制View简单很多,兼容性也更稳定。

内容的提问来源于stack exchange,提问作者Mithun Wijethunga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:57:33