最近做一个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录屏功能吗,Android录屏功能的实现相关推荐

  1. drm android 截屏,DRM-X4.0新增防盗录功能Windows智能防录屏,全面防止截屏和屏幕录制...

    据国家版权局网络版权产业研究基地研究调查显示,2018年中国网络版权产业规模达7423亿元,相比2017年6364.5亿元增长了16.6%,成为中国经济增长的新动能.随着互联网技术的急速发展,尤其是在 ...

  2. Android 音视频开发(六) -- Android Mediaprojection 截屏和录屏

    Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍照功能 Andro ...

  3. html禁止手机截屏,[置顶] Android 应用内禁止截屏功能的实现

    截图介绍 Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下,截 ...

  4. Android开发中ListView多屏的全选、反选功能

    [size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...

  5. android布局管理器模仿qq登录效果,Android程序开发仿新版QQ锁屏下弹窗功能

    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...

  6. Android 如何实现App在后台录屏

    在 Android 中实现 App 在后台录屏主要需要使用到 MediaProjection API. MediaProjection API 是 Android 5.0(API Level 21)引 ...

  7. android中布局全屏,怎么在Android 应用中实现一个全屏与非全屏功能

    怎么在Android 应用中实现一个全屏与非全屏功能 发布时间:2020-12-04 17:31:45 来源:亿速云 阅读:135 作者:Leah 怎么在Android 应用中实现一个全屏与非全屏功能 ...

  8. Android系统永不熄屏和取消开机锁屏功能

    Android系统取消开机锁屏功能和永不熄屏 源码 frameworks/base/packages/SettingsProvider/src/com/android/providers/settin ...

  9. android横竖屏切换动画,Android应用怎么实现屏幕横竖屏切换功能

    Android应用怎么实现屏幕横竖屏切换功能 发布时间:2020-11-26 15:48:57 来源:亿速云 阅读:121 作者:Leah Android应用怎么实现屏幕横竖屏切换功能?针对这个问题, ...

最新文章

  1. openStack 手动部署文档
  2. VB中使用MD5算法
  3. 互联网如何“武装”农民?
  4. Proxy pattern-代理模式
  5. java ico图片转png_Java 图片处理: ico 格式转 PNG/JPG 等格式
  6. 同源、跨域、跨站、SameSite与withCredentials
  7. 知乎爬虫请求头参数x-zse-96(代码可直接运行)
  8. 【周记】腾讯犀牛鸟「云开发」校园技术布道师养成计划
  9. 目前流行的装修风格_2020最新装修风格,目前流行的装修风格,值得收藏!
  10. 【css】渐变-背景渐变、边框渐变、文字渐变
  11. 【2019年04月04日】股市指数估值排名
  12. 《HelloGitHub》第 65 期
  13. 【MySQL】16-超详细的MySQL单行函数汇总
  14. Java菜鸟到大牛学习路线培训视频
  15. 一兆宽带服务器搭建网站,云服务器宽带只有一兆
  16. 2.1 法学的历史(一):西方法学的历史
  17. matlab设计风电机外部控制器,【matlab编程代做】步进电机控制器设计
  18. 《linux》笔记2
  19. SAP生产订单实现多套工艺路线切换
  20. MATLAB之优劣解距离法Topsis模型

热门文章

  1. 龙珠激斗获取服务器信息中,龙珠激斗孙悟空碎片获取途径一览
  2. MySQL锁机制全面解析
  3. TinyMCE粘贴word图片且图片文件自动上传功能
  4. computed属性与methods、watched
  5. 80后90后成股市开户主力 网友调侃解套有希望了
  6. [转]战棋系统的分析
  7. 阻塞队列和线程池原理
  8. 快速搭建git开发环境+GitHub使用+TortoiseGit
  9. [初学python]苹果何时开放IOS降级通道啊?
  10. 通过noVNC远程连接Windows桌面详解(python版)