**
前言
**
随着全球产业链线上化和数字化的加速,移动端实时屏幕共享在各行各业场景下都有了广泛的应用,比如在线教育、视频会议、远程业务咨询、手游直播。而屏幕采集则是实现实时屏幕共享流程中的第一步,本篇技术分享就来跟大家讲讲拍乐云在 Andorid 端屏幕采集的经验实践。
背景
Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限。从 5.0 开始,Google 开放了系统录屏API:MediaProjection 和 MediaProjectionManager,不需要 root 权限,但是会弹出录屏权限申请框,用户同意后才能开始录屏,类似 Android6.0 之后权限申请流程。
鉴于目前市面上5.0以下的 Android 手机占比很低且屏幕采集需要 root 权限实现复杂,接下来我们主要介绍 Android5.0 及以上版本的屏幕采集原理。
试想一下,一套完整的屏幕采集流程应该是怎样的?屏幕数据源(生产者)在缓冲区产生数据,屏幕数据消费者从缓冲区提取数据使用。不同的消费者可以实现不同的功能,比如录屏保存和录屏直播(屏幕共享)。这些关键的角色在Android 端又是由谁来扮演呢?
VirtualDisplayVirtualDisplay 是 Android 上的虚拟显示器。本文里VirtualDisplay 的作用就是抓取屏幕上显示的内容,是屏幕数据的生产者。
Surface 在 Android 的窗口实现里,Surface 对应了一块屏幕数据缓冲区,屏幕数据生产者可以在 Surface 上生产数据,消费者则从 Surface 中提取数据使用。
屏幕采集流程
介绍完以上关键角色,我们大致可以画出一套屏幕采集流程图:
下面逐步介绍代码实现。
一、获取MediaProjection
首先需要获取 MediaProjectionManager 服务,然后通过 MediaProjectionManager 服务,获取一个申请屏幕采集权限的 Intent 并启动屏幕采集申请权限界面:
mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
Intent intent = mediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(intent, SCREEN_CAPTURE_REQUEST_CODE);
启动的屏幕采集权限申请界面如下:
用户允许(点击立即开始)后,在 onActivityResult 回调里根据返回的resultCode和 data 获取