Android录屏功能的实现

原创 2016年07月01日 15:21:25

       最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的。直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.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的形式获取当前屏幕,核心代码是:

        View view = activity.getWindow().getDecorView();
//      Enables or disables the drawing cache
        view.setDrawingCacheEnabled(true);
//      will draw the view in a bitmap
        view.buildDrawingCache();
        Bitmap bitmap = 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.导入接口
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
2.实例化MediaProjectionManager
mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
3.利用MediaProjectionManager类实例的功能函数createScreenCaptureIntent()生成intent,为接下来的的抓取屏幕做准备
Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE);
4.在onActivityResult()中获取返回值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
    if (mediaProjection == null) {
        Log.e("@@", "media projection is null");
        return;
    }
5.实例化VirtualDisplay,这个类的主要作用是用来获取屏幕信息并保存在里。
private VirtualDisplay mVirtualDisplay;
mVirtualDisplay = mMediaProjection.createVirtualDisplay(TAG + "-display",
        mWidth, mHeight, mDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
        mSurface, null, null);
6.保存图片。目前的图片信息保留在mSurface里,建立一个Image获取信息保存在BufferByte里再保存在一个bitmap里即可。

如此一来,整个截屏就变得简单多了。而且还可以使用Mediacodec编码,MediaMuxer封装转为MP4等格式来进行录屏,实在是简单又好用了

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android视频录制命令screenrecord

Android视频录制命令screenrecord 你要知道: screenrecord是一个shell命令支持Android4.4(API level 19)以上支持视频格式: mp4 ...

Android判断某个服务是否正在运行

/** * 判断某个服务是否正在运行的方法 * * @param mContext * @param serviceName * ...

安卓录屏

转载自http://www.jianshu.com/p/e9a9771eb7b8 引言 网上很多关于 Android 录屏的解决方案是通过读取 /dev/graphics/fb0 里面...

android 5.0+录屏功能实现

Android Lollipop (5.0) 屏幕录制实现 基本原理在 Android 5.0,Google 终于开放了视频录制的接口,其实严格来说,是屏幕采集的接口,也就是 MediaProjec...

Android实现录屏直播(一)ScreenRecorder的简单分析

转载地址:http://blog.csdn.net/zxccxzzxz/article/details/54150396

Android实现录屏直播(二)需求才是硬道理之产品功能调研

请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54150396前面的Android实...

Android之VirtualDisplay类简介

本文链接: Android之VirtualDisplay类简介 知识点: 1、屏幕截屏VirtualDisplay类简介; 2、VirtualDisplay类方法简介; 3、新名词记录{ D...

Android录屏的三种方案

本文总结三种用于安卓录屏的解决方案: 1. adb shell命令screenrecord 2. MediaRecorder, MediaProjection 3. MediaProjectio...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)