Android录屏功能的实现

最近做一个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等格式来进行录屏,实在是简单又好用了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android视频截屏&手机录屏实现代码

    本文介绍了android视频截屏&手机录屏实现代码,分享给大家,希望对大家有帮助 问题 在android中有时候我们需要对屏幕进行截屏操作,单一的截屏操作好解决可以通过activity的顶层view DecorView获取一个bitmap,得到就是当前activity上面的全部视图. View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(

  • 用vbs记录屏幕保护程序的开始时间和结束时间

    问: 您好,脚本专家!如何记录屏幕保护程序的开始时间和结束时间? -- JS 答: 您好,JS.您知道,一位脚本专家(嘿,谁说"肯定是 Greg"?)年纪大得记得屏幕保护程序刚出现的日子.那时,这类脚本毫无意义.毕竟,屏幕保护程序启动后,每个人都神魂颠倒,从未想过让它结束.事实上,作为计算机支持人员的这位脚本专家首先必须做的一件事就是在每个人的桌面上创建快捷方式,使他们能够随时启动"飞转的小烤炉". 那时人们很容易得到快乐. 啊,但是活在过去没有意义,对吧?在今天的

  • Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视频文件 (2)使用Google浏览器(Google Chrome)提供的扩展程序Vysor将手机界面演示在电脑上(几乎没有延时羡慕) 下面我们具体介绍两种方法的使用步骤: 一.使用cmd命令录屏 (1)SDK下载 网上有各种SDK下载的方法,个人认为安装AndroidStudio后连接自己的手机,根

  • Android5.0以上版本录屏实现代码(完整代码)

    我录屏的方式是分别录制音频和视频,最后合并成mp4格式,比较麻烦,因为网上完整的教程比较少,所以我打算写一个完整版的,照着我的代码写完之后,至少是能够实现功能的,而不是简单的介绍下用法. 1既然是录制视频,我们应该有一个按钮控制开始和结束. 2在录制之前,需要先判断一下Android系统的版本是否大于5.0,并且动态申请一下权限(读写,录音,照相机),这一步可以在点开始按钮的时候执行 if (ContextCompat.checkSelfPermission(context, Manifest.

  • 详解有关Android截图与录屏功能的学习

    简单的截屏和录屏功能. 因为MediaProjection是5.0以上才出现的,所以今天所讲述功能实现,只在5.0以上的系统有效. 截屏: 步骤如下: 1:获取MediaProjectionManager 2:通过MediaProjectionManager.createScreenCaptureIntent()获取Intent 3:通过startActivityForResult传入Intent然后在onActivityResult中通过MediaProjectionManager.getMe

  • Android录屏功能的实现

    最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的.直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.0时候开放了一个新的接口---android.media.projection,一下子让这个问题变得简单了.所以说查阅资料也该注意实时性,现在很多技术推陈出新速度很快,一些新的包,接口,方法会让问题更好更快的解决.不过自己还是决定总结了下之前的一些想法,也算是一个学习吧. 首先说下之前的几种方法.一般最开始的 An

  • android实现录屏功能

    本文实例为大家分享了android实现录屏功能的具体代码,供大家参考,具体内容如下 1.mian.activity package com.fpt.screenvideo; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.media.projection.MediaProjectionManager; import androi

  • Android录屏的三种解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCodec和MediaMuxer screenrecord命令 screenrecord是一个shell命令,支持Android4.4(API level 19)以上,录制的视频格式为mp4 ,存放到手机sd卡里,默认录制时间为180s adb shell screenrecord --size 1280

  • 浅析Android录屏 MediaRecorder

    MediaRecorder类介绍: MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息. Android录屏的三种方案 1.adb shell命令screenrecord 2.MediaRecorder, MediaProjection 3.MediaCodec和MediaMuxer, MediaProjection , 一.screenrecord命令 screenrecord是一个shell命令,支持Android

  • python实现录屏功能(亲测好用)

    前言 由与上不了学,教我们Mastercam的老师提前给我们布置了4道习题.对我们太好了,谢谢老师� 没办法,干就完了. 只是要求附上制作过程视频,就想到了能不能用python做个录屏的程序,于是在网上看了好多文章,发现很多都不是很好用,要不就是太麻烦(我就录个屏,不用声音,也不用控件).最后看到了一个符合我要求的,可以去看看这里(感谢!) 不过呢,俗话说:适合自己的才是最好的.当我们用的时候,会发现录制的时间和视频播放的时间不一致,有的快了,有的慢了,所以就想出了原因与解决办法.接

  • python实现录制全屏和选择区域录屏功能

    最近给客户演示程序运行结果,我就想到用Python写一个录屏程序,在网上能找到现成的源码,但是它的录屏是录制整个屏幕的.但是在屏幕桌面下方的任务栏工具栏里有些东西,不希望被录制到视频里,因此需要实现一个选择区域录屏,就像qq截图那样的.我编写的程序如下,在主函数的输入参数里有一个选项控制是全屏录制还是选择区域录制.在编写这个程序时,我有一个疑问,在初始化写视频VideoWriter函数的第4个参数,它表示视频帧的高和宽,全屏录制方式的参数是(height,width),选择区域录制的参数是(wi

  • python基于tkinter实现gif录屏功能

    一.主界面实现 (一)实现最简单的窗体 from tkinter import * if __name__ == '__main__': tk = Tk() tk.geometry('500x400+500+150') tk.title('有趣的透明窗体-开篇了!!!') canvas = Canvas(tk) canvas.pack(fill=BOTH, expand=Y) tk.mainloop() 太简单了,不详细说了,相信大家都看得懂. (二)把灰色设置成透明色 TRANSCOLOUR

  • 用JS创建一个录屏功能

    OBS studio很酷,但 JavaScript 更酷,现在,我们用 JavaScript 创建自己的录屏功能. 首先,创建一个HTML文件,包含记录按钮和一个播放标签, 内容如下: <!DOCTYPE html> <html> <head> <title>Parcel Sandbox</title> <meta charset="UTF-8" /> </head> <body> <

  • OpenCV实现简单录屏功能

    本文实例为大家分享了OpenCV实现简单录屏功能的具体代码,供大家参考,具体内容如下 OpenCV中VideoCapture和VideoWriter用于读写视频文件,这里的录屏功能用到VideoWriter,用于将捕获的屏幕的每一帧数据保存到视频文件. VideoWriter写视频文件的步骤 1.bool open(const String& filename, int fourcc, double fps,Size frameSize, bool isColor = true);2.void

随机推荐