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

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

时间: 2018-05-06

android 手机录屏功能,Android录屏功能的实现相关推荐

  1. 解决部分android手机页面跳转的黑白屏、闪屏、显示桌面背景问题

    解决部分android手机页面跳转的黑白屏.闪屏.显示桌面背景问题 关于 修改后的方案效果图 问题思路及解决办法 最终方案 关于   今天在查看登录页面美观度的时候意外发现手上的oppo手机在页面跳转 ...

  2. android手机用户,2011年Android手机用户使用行为研究报告

    一.市场概述及研究背景 谷歌Android,自获得摩托罗拉.三星.HTC.中兴.华为等诸多品牌的拥趸开始,就扮演起了智能手机市场竞争格局颠覆者的角色.经过近三年时间的发展,Gartner最新数据显示, ...

  3. android手机截图gif,bash 一键录屏 Android 生成 gif 文件脚本

    目的 编写 bash 脚本, 实现一行命令得到 Android 手机录制屏幕 gif 动图文件. 博主使用 ubuntu 系统, shell 为 bash. 这个脚本也可以用在 mac 系统上. 听说 ...

  4. android手机连接电脑时直接截屏到电脑

    如题,android手机连接mac,直接快速截屏到mac. 解决方法: 利用android的adb命令即可: #截取手机屏幕保存到SDCard adb shell /system/bin/screen ...

  5. Android手机计步器中加速度传感器熄屏时的侦听

    基于开源https://github.com/296777513/pedometer/ 在mate2上弄一个计步器,发现熄屏后,计步器无法工作,查阅资料发现某些手机上的加速度传感器熄屏时无法工作,这个 ...

  6. 金碟旗舰版凭证反记功能在哪_我们希望今年所有旗舰Android手机都能拥有的五个功能...

    金碟旗舰版凭证反记功能在哪 We're five months into 2017 now, and we've already seen a lot of Android phones hit th ...

  7. android 手机 otg,对于安卓智能手机的OTG功能,你了解多少

    随着智能手机功能的多样化,用户对手机内存的需求也在不断增加.各种照片,音乐,视频,应用程序等日新月异. 当这些应用程序几乎占用手机内存时,可能会出现运行缓慢,闪回,系统暂停等情况,这会诱使人们购买带有 ...

  8. Android手机状态栏通知(Notification)的功能与用法

     1.Notification 是显示在手机状态栏的通知--手机状态栏位于手机屏幕的最上方那里一般显示了手机当前网络状态.电池状态.时间等. 2.Notification 代表的是一种具有全局效果 ...

  9. 全球 android手机排行 2013,全球Android手机性能排行 三星Note 3夺魁

    尽管跑分测试成绩并不是手机实际性能表现的全部,但至少还是能够在很大程度上体现一款手机硬件配置的水平.而作为知名的跑分软件,安兔日前公布了今年第三季Android手机性能排行榜,则或许能够给我们一些参考 ...

  10. android手机连接windows,将Android手机投影到Windows 10 PC [夏昆冈]

    Windows 10 预览版Build 14328加入了原生的Miracast投影功能,简单说,任意加入无线网络的Win10设备都可以成为一台无线显示器设备.这样一来,几乎所有Android手机和Wi ...

最新文章

  1. LeetCode 14. Longest Common Prefix
  2. react native基本调试技巧
  3. AndroidStudio打开新项目后解决下载某版本gradle慢的问题
  4. 6.5 不同类型的数据集
  5. 老板的表弟数不清(转)
  6. AUTOSAR从入门到精通100讲(七十九)-AUTOSAR基础篇之DTC
  7. Mysql limit 子查询
  8. 如何通过虚拟私有云保障服务安全【华为云分享】
  9. MEF初体验之六:导出和元素据
  10. 259 [LeetCode] 3Sum Smaller 三数之和较小值
  11. 都是打工的,为啥职场中存在着那么多勾引斗角?
  12. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
  13. Visual Leak Detector(vld)无法显示内存泄露行号
  14. ZMQ专题学习之六:libzmq的订阅代理模式通信方式
  15. 上海康桥先进制造技术创业园项目远程预付费系统的应用-安科瑞耿敏花
  16. 为什么使用start方法启动Java的Thread线程?
  17. BGP Confederation(BGP联盟)
  18. python-pptx----母版制作
  19. java程序员拜年代码_程序员的新年祝福是什么样的?
  20. 阿里云实人认证的功能及应用

热门文章

  1. 学竞赛对高考有帮助吗?
  2. PHP谷歌支付[APP]
  3. 新能源汽车手机智能控制无钥匙进入一键启动系统总体设计方案
  4. 门窗传感器能与哪些设备联动
  5. 苹果当前系统时间与服务器不一致,mac双系统时间不对怎么办 mac双系统时间不一致解决办法...
  6. 小红书素人笔记怎么撰写?
  7. 百度人脸实时识别软件
  8. 商务旅行代理服务市场现状研究分析-
  9. 免费物流快递单号查询接口快速对接指南
  10. iPhone 设备查询