张孟琦
摘要 本文旨在为了方便各层级用户群的使用,通过对手机安卓平台下的屏幕录制技术进行探究,对其中权限、安卓版本、创建虚拟屏幕等核心技术进行探究。
【关键词】软件开发 安卓 屏幕录制
在移动互联网的时代,手机、平板电脑、智能穿戴设备、定位导航等移动互联客户端的使用早已与人们日常生活建立了千丝万缕的联系。在当今的信息技术潮流中,PC端的操作系统中Windows、Linux、OSX占着绝对市场份额;而在移动端,则是以Android和iOS占着绝对庞大的用户量。IOS系统是苹果公司的核心技术,而谷歌公司的安卓系统,则是被全世界大多数的移动互联网公司所使用,例如中国的华为和小米、韩国的三星、日本的索尼和夏普等。在如此之高的受欢迎程度之下,安卓系统迎来了Android9.0版本,这是一个更为人性化和智能化的系统环境。但是其用户群不局限于年轻人,当老年用户使用遇到问题而身边没有对象帮助他们时,一个屏幕录制的手机应用就会发挥它独特且实用的功能。本文旨在为了方便各层级用户群的使用,通过对手机安卓平台下的屏幕录制技术进行探究,对其中权限、安卓版本、创建虚拟屏幕等核心技术进行探究。
1 屏幕录制技术的概述
谷歌公司从Android4.4开始,在手机端添加了本地化的录制功能,但当时的技术有限,需要获取root权限才可以,谷歌的工程师在历经一年的研发下,发布的Android5.0中正式引用MediaProjection,使用它可以在不用root的情况下录制屏幕,但同时需要用户对自动弹出的权限窗口进行操作,并且只有在用户允许的情况下才可以,本文介绍的就是Android5.0中通过MediaProjection实现的屏幕录制。
2 屏幕录制技术的基本原理
在安卓5.0以及API21以上的版本中,谷歌公司的安卓环境均开放了视频录制和音频录制的接口,这样的接口,也可以称之为屏幕采集接口,即所谓的MediaProjection和MediaProjectionManager,需要用到的安卓四大组件仅有activity和service。
3 屏幕录制技术的开发环境
软件环境:Windows XP/Windows7/Windows10
硬件环境:E7500+4G内存+320G硬盘+百兆网卡+百兆局域网
开发工具:Android Studio 3.1.0
4 屏幕录制软件的模块分析
根据软件功能的需要,我们创建了三个Java类,其中MainActivity.java类主要完成了管理器模块、权限申请模块、连接模块的设计。实现的功能主要有:点击事件监听、动态权限申请、解绑已绑定的服务、设计请求码和结果码、连接与取消连接等。RecordApplication.java类中主要实现的功能有:获得上下文、启动时绑定服务、创建记录应用实例等。RecordService.java类中重写了绑定、启动、创建、销毁四个方法。主要实现的功能有:设置录制屏幕大小、开始记录、结束录制、创建虚拟屏幕、初始化记录器、获取存储路径等方法。如图1功能模块图所示。
5 屏幕录制技术的核心技术
5.1 屏幕录制技术的权限申请
权限的设置,是通过对AndroidManifest.xml文件中添加用户权限许可标签,即
5.2 MediaProjectionManager的使用
MediaProjectionManager從翻译上来看,是媒体工程管理器的意思,实际上MediaProjectionManager也是系统服务的一种,它的实例必须是私有且用户不可见的,MediaProjectionManager出现在主activity.class文件中,通过getSystemService方法来获取实例,与媒体工程Service建立联系。MediaProjectionManager在这项应用里起着管理器的作用,在对返回值结果分析的方法中,将结果码和数据传递给MediaProjection的实例,使得记录服务可以顺利地进行。
5.3 MediaProjection的使用
MediaProjection从翻译上来看,是媒
体工程的意思,可以看出它在整个屏幕录制应用程序中起着核心作用,同样它的实例也必须是私有且用户不可见的。在本项目的service中通过setMediaProject方法将最初的project赋值给mediaProjection。在主活动的onActivityResult方法中,判断如果请求码与记录请求码相等或结果请求码等于OK,这时MediaProjection的实例将正式获得结果码和数据。MediaProjectionManager和MediaProjection均出现在主activity中一起完成了事件的活动结果的响应分析。
5.4 发起屏幕捕捉请求
对手机界面变化的录制,其直观的感受就在于对屏幕的变化进行捕捉,这里就需要用到相应的Intent,屏幕捕捉本身就是一个意图,在相应的API中就有createIntentCaptureIntent方法,通过MediaProjectionManager的实例初始化一个屏幕捕捉意图(captureIntent),并将其作为开始活动的请求码。这个Intent的定义是需要判断的,如果当前的recordService不在运行,那么才去选择创建这个Intent;如果recordService正在运行,那么我们此时正处于录制过程中,在判断语句里需要勒令其停止,并显示具有开始录制功能的按钮,使得用户可以进行重新录制的操作。
5.5 创建虚拟屏幕
创建虚拟屏幕是通过MediaProject进行屏幕录制的关键所在,虚拟屏幕的创建方法出现在相应的service中,且该方法只能在该service中进行调用,该方法的参数VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR是指创建屏幕镜像,所以我们实际录制内容的是屏幕镜像而不是真实的屏幕,这也就是为什么进行屏幕录制时,屏幕的显示会发生失真等细微的变化,但录制的内容和实际屏幕是一样的,并且这里我们把VirtualDisplay的渲染目标Surface设置为MediaRecorder的getSurface,后面我就可以通过MediaRecorder将屏幕内容录制下来,并且存成视频文件。
5.6 录制屏幕数据
这里利用MediaRecord将屏幕内容保存下来,当然也可以利用其它方式保存屏幕内容,例如:ImageReader,但我们这个项目使用的是MediaRecord,实现一次屏幕录制主要有三步,初始化录制器、创建虚拟屏幕、录制器启动,我们定义了initRecord方法,里面创建了一个File对象并指定路径,之后使用mediaRecord对象依次调用设置音频资源方法,设置视频资源,设置输出文件,设置视频尺寸、设置音频编码、设置视频编码、设置帧速率方法,从而实现了录制功能。
6 屏幕录制软件的UI设计
每一款软件的UI无疑是最吸引用户使用兴趣的部分之一,由于屏幕录制软件的设计以精简为原则,所以采用了主题资源:@style/Theme.AppCompat.Light.Dialog,这个主题相当于是一个对话框,软件中只包含Button控件,因此不必显示出占满整个手机屏幕的界面。
7 结束语
信息时代的浪潮从以pc机为主导的互联网,发展到今天的以智能手机为主导的移动互联网时代,每一代操作系统的革新都会为软件开发带来便利性,Google公司的Android平台为移动互联网的软件开发带来了福音,每一代API都会打开新的接口,譬如我们的屏幕录制技术,从最开始通过对AndroidManifest.xml文件中添加用户权限许可标签,发展到可以使用java代码添加权限,我相信,随着安卓API的发展,未来的某一天,屏幕录制可能就会简化为一个简单的方法,直接导入包,在类中使用该方法即可。当然,这一切的梦想的实现,都是每一代软件人奋斗出来的。
参考文献
[1]孙恺.屏幕录制软件在计算机教学中的使用[J].科技与创新,2018(15):153-154.
[2]倪晓军,郑龙.基于MirrorDriver的自适应屏幕录制算法[J].计算机工程,2011(11).
[3]张旭辉.基于安卓系统的APP開发技术探析[J].电子制作,2016(14):34.
[4]张海藩,吕云翔.软件工程[M].人民邮电出版社,2013.
[5]李文琴,李翠霞.Android开发与实践[M].人民邮电出版社,2012.