Android录屏功能的实现
最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的。直到后来在github上看到一个比较新的代码,才恍然发现,Android5.0时候开放了一个新的接口---android.media.projection,一下子让这个问题变得简单了。所以说查阅资料也该注意实时性,现在很多技术推陈出新速度很快,一些新的包,接口,方法会让问题更好更快的解决。不过自己还是决定总结了下之前的一些想法,也算是一个学习吧。
首先说下之前的几种方法。一般最开始的Android截屏程序,都是来源于Linux的截屏方法,android使用的Linux内核,那么Linux下的截屏方法也就最先被android采用。Linux 使用了framebuffer管理显示输出,传统的办法就是读取framebuffer的数据,然后得到整个屏幕的数据。此方法在Android3.0版本之前是也唯一可行的方法。然而linux采用了严格的权限控制设备文件,framebuffer也是其控制之一,在Android中只有root,和graphic组用户才有权限读取,所以要采用读取framebuffer的方式实现截屏,应用必须获得root权限。
后来呢,大家都知道ROOT权限是件比较麻烦的事,给自己软件加上ROOT权限对于客户来说也是一件挺有风险的事,于是后来常用的一种方法就是自定义view利用bitmap获取view的形式获取当前屏幕,核心代码是:
Viewview=activity.getWindow().getDecorView(); //Enablesordisablesthedrawingcache view.setDrawingCacheEnabled(true); //willdrawtheviewinabitmap view.buildDrawingCache(); Bitmapbitmap=view.getDrawingCache();
然后将bitmap保存即可。但是这样的方法有个明显的缺陷就是这样截出来的图无法获取状态栏以及一些dialog。
此外比较常见的方法还有读取framebuffer的方式,利用接口SurfaceFlinger的方式,通过ddms截屏的方式等方法,但都有局限性。
于是谷歌就是Android5.0版本时候发放了现在的这个接口android.media.projection.MediaProjection。使用该接口,第三方应用程序无需获取系统root权限也可以直接进行屏幕截图操作了。查询其官方api可知,该接口主要用来“屏幕截图”操作和“音频录制”操作。好吧,直接上干货吧。
一、使用方法。
首先用参数MEDIA_-PROJECTION_SERVICE调用Context.getSystemService(),得到MediaProjectionManager类别实例;
其次,调用createScreenCaptureIntent()得到一个Intent;再次,使用startActivityForResult()启动屏幕捕捉;
最后,将结果返回到getMediaProjection()上,获取捕捉数据。
二、Demo案例。
1.导入接口
importandroid.media.projection.MediaProjection; importandroid.media.projection.MediaProjectionManager;
2.实例化MediaProjectionManager
mMediaProjectionManager=(MediaProjectionManager)getSystemService(MEDIA_PROJECTION_SERVICE);
3.利用MediaProjectionManager类实例的功能函数createScreenCaptureIntent()生成intent,为接下来的的抓取屏幕做准备
IntentcaptureIntent=mMediaProjectionManager.createScreenCaptureIntent(); startActivityForResult(captureIntent,REQUEST_CODE);
4.在onActivityResult()中获取返回值
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ MediaProjectionmediaProjection=mMediaProjectionManager.getMediaProjection(resultCode,data); if(mediaProjection==null){ Log.e("@@","mediaprojectionisnull"); return; }
5.实例化VirtualDisplay,这个类的主要作用是用来获取屏幕信息并保存在里。
privateVirtualDisplaymVirtualDisplay;
mVirtualDisplay=mMediaProjection.createVirtualDisplay(TAG+"-display", mWidth,mHeight,mDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, mSurface,null,null);
6.保存图片。
目前的图片信息保留在mSurface里,建立一个Image获取信息保存在BufferByte里再保存在一个bitmap里即可。
如此一来,整个截屏就变得简单多了。而且还可以使用Mediacodec编码,MediaMuxer封装转为MP4等格式来进行录屏,实在是简单又好用了.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。