Android实现录屏和截屏功能

  • 1. MediaProjectionManager介绍
  • 2.所需权限
  • 3.示例代码

1. MediaProjectionManager介绍

用于获取screen capture的主要类,在Android 5.0(Api Level 21)时添加。
核心方法:
(1)创建:public Intent createScreenCaptureIntent ()

Returns an Intent that must be passed to startActivityForResult() in order to start screen capture. The activity will prompt the userwhether to allow screen capture. The result of this activity should be passed to getMediaProjection.

(使用时会弹出授权弹窗,只有用户授权后才能使用)

(2)获取:public MediaProjection getMediaProjection (int resultCode,
Intent resultData)

Retrieve the MediaProjection obtained from a succesful screen capture request. Will be null if the result from the startActivityForResult() is anything other than RESULT_OK.

2.所需权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

3.示例代码

   MediaProjectionManager mediaProjectionManager;int width, height, dpi;private void startScreenShot(String account) {WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);if (windowManager != null) {DisplayMetrics displayMetrics = new DisplayMetrics();windowManager.getDefaultDisplay().getMetrics(displayMetrics);width = displayMetrics.widthPixels;height = displayMetrics.heightPixels;dpi = displayMetrics.densityDpi;}mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);if (mediaProjectionManager != null) {startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 10086);}}

说明:

  • int width, height, dpi 等数据在保存截屏时有用,所以先初始化。
  • 真正的启动:startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 10086);
  • 紧接着就是在onActivityResult里获取MediaProjection即可,请往下看。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 3);mediaProjection.createVirtualDisplay("screen_shot",width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,imageReader.getSurface(), null, null);imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = reader.acquireNextImage();//获取下一帧截屏,这里可以控制你是否要单个或者直接录屏int width = image.getWidth();int height = image.getHeight();final Image.Plane[] planes = image.getPlanes();final ByteBuffer buffer = planes[0].getBuffer();int pixelStride = planes[0].getPixelStride();int rowStride = planes[0].getRowStride();int rowPadding = rowStride - pixelStride * width;Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);bitmap.copyPixelsFromBuffer(buffer);if (bitmap != null) {try {// 获取内置SD卡路径String sdCardPath = Environment.getExternalStorageDirectory().getPath();// 图片文件路径String filePath = sdCardPath + File.separator + "screenshot.png";File file = new File(filePath);FileOutputStream fos = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();fos.close();} catch (Exception e) {}} else {}image.close();}}, null);}

说明

  • ImageReader说明,ImageReader这个类被允许直接从Surface接收渲染的图像数据。简单来说,它就是能直接能接受屏幕上的图像渲染数据。

The ImageReader class allows direct application access to image data rendered into a Surface

  • ImageReader.newInstance(int width, int height, int format, int maxImages) 创建新的reader以获取期望的size和format的Images.上述代码写的获取3张,就是ImageReader的队列最多缓存三张屏幕实时截图。
  • Image image = imageReader.acquireNextImage();从ImageReader的队列中获取下一帧Image,如果没有新的则返回null。不过推荐我们使用acquireLatestImage来代替使用此方法。因为它会自动帮我们close掉旧的Image,并且能让效率比较差的情况下能获取到最新的Image。acquireNextImage更推荐在批处理或者后台程序中使用。
  • 拿到Image类后,就可以将获取ByteBuffer,存储成图片,这样截图当前屏幕数据就完成,录屏的道理也一样,因为视频也是一帧一帧图片组成。

Android实现录屏和截屏功能相关推荐

  1. android实现长截屏,Android实现全屏截图或长截屏功能

    本文实例为大家分享了Android实现全屏截图或长截屏功能的具体代码,供大家参考,具体内容如下 全屏截图: /** * 传入的activity是要截屏的activity */ public stati ...

  2. Android安全:禁止APP录屏和截屏

    Android有些APP会为了安全,禁止录屏和截屏,例如:金融.银行相关的.禁止录屏和截屏并不难,只需要在 Activity 的onCreate() 方法中添加一行代码即可: getWindow(). ...

  3. android截全屏方法,Android实现全屏截图或长截屏功能

    本文实例为大家分享了Android实现全屏截图或长截屏功能的具体代码,供大家参考,具体内容如下 全屏截图: /** * 传入的activity是要截屏的activity */ public stati ...

  4. 禁止APP录屏和截屏

    Android安全:禁止APP录屏和截屏 一.前言: Android有些APP会为了安全,禁止录屏和截屏,例如:金融.银行相关的.禁止录屏和截屏并不难,只需要在 Activity 的onCreate( ...

  5. FSCapture(录屏,截屏软件)

    FSCapture(录屏,截屏软件) FSCapture是一款功能强大且十分实用的抓屏软件,该款软件集成了图像捕捉.图像浏览以及图像编辑等功能为一体,帮助用户对截取的图形进行处理操作,该款软件的操作十 ...

  6. Android 基于4.4系统截屏的三指截屏

    根据上一篇文章Android 4.4系统原生截图解析 ,我们知道系统截屏是调用了TakeScreenshotService,为实现在任何界面都能实现三指截屏,我们就得在PhoneWindow(fram ...

  7. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  8. Android平台监听系统截屏方案预研及相关知识点

    最近有个针对系统截屏的需求,所以预研了Android平台上捕获系统截屏的方案. 最直接的方式就是监听手机的系统截屏组合键(电源键+音量下键),但是这种方式实现难度大,且有的机型使用特殊手势进行截屏,兼 ...

  9. android截屏快捷键 截屏工具 音量下键+电源键

    一般来说android手机或者平板,只要用两个手指同时按下:音量下键+电源键,一秒钟即可截屏,截屏图片保存到了/sdcard/Pictures/Screenshots文件夹下面.这个方法在nexus ...

最新文章

  1. cv::cuda::split 使用
  2. java 27 - 4 反射之 通过反射获取成员变量并使用
  3. 非线性方程组求解Matlab实现 (多元牛顿方法、Broyden方法、Broyden方法2)
  4. linux下ftp服务器的搭建与使用
  5. 阶段1 语言基础+高级_1-2 -面向对象和封装_9两个引用指向同一个对象空间
  6. django的模板系统过滤器笔记
  7. login组件的两种用法_Vue.js 组件该如何正确的复用和扩展
  8. 三维立体图的原理和欣赏方法
  9. PLC通讯之串口转以太网/WIFI的透传模块(DTU)的专用OPC软件和DLL通讯组件
  10. 【牛腩】-母版图片不显示问题
  11. 【《大象》第一部分】初识UML和建模基础
  12. P1598 垂直柱状图(模拟)
  13. dnf剑魂buff等级上限_DNF:国服鬼剑85版本以来的变迁,剑魂最惨,阿修罗起伏不大...
  14. 笔记本光驱在计算机里不显示器,电脑开机硬盘灯一直亮不闪的 光驱没反应显示器不显示 风扇都转的...
  15. linux平台Android studio安装步骤
  16. php–strace,关于strace
  17. Java学习_Day016
  18. [分布式]:关于分布式一致性的探究
  19. AI人脸识别+体​温检测系统解决方案
  20. discuzX2论坛 flash 上传略解

热门文章

  1. 微信小程序——首次使用显示“添加到我的小程序”
  2. hg clone是啥玩意
  3. The Mythical Man-Month
  4. 安全 · 事大——从软件供应链攻击看SCA
  5. 在刷leetcode中遇到错误
  6. 单工序冲裁模的典型结构
  7. 惠普Probook440g1加装三星SSD
  8. html5属性单词,常用的CSS属性的英文单词总结及用法、解释
  9. 技术点解读 | aelf共识标准设计
  10. PS图片处理:凌乱图片变炫彩背景(转)