很久没写了,随便写写~~

额,这是一个很简单的截屏工具,用的是Android系统的MediaProjectionManager实现截屏录制功能

使用到的主要类:

说明
MediaProjectionManager MediaProjection管理
MediaProjection 授予捕获屏幕或记录系统音频的功能
VirtualDisplay 个人理解类似虚拟屏幕?捕获屏幕后将数据输出到虚拟屏幕 然后可以获取视频的信息,指定输出的位置等
ImageReader 这个类被允许直接从Surface接收渲染的图像数据
MediaRecorder 用于将音视频编码输出

流程:

  • 1.申请录屏screenCaptureIntent
  • 2.调用activity的 startActivityForResult(screenCaptureIntent,code);需要用户允许
  • 3.在onActivityResult获取屏幕录制的操作对象mMediaProjection = mediaProjectionManager.getMediaProjection(resultCode, resultData);
  • 4.MediaProjection + VirtualDisplay + Surface(根据情况使用提供者) 实现录屏截屏功能

使用:

1.在Activity的onCreate下创建

screenshotRecordUtil = new ScreenshotRecordUtil();
screenshotRecordUtil.screenCaptureIntent(this, new ScreenshotRecordUtil.ScreenshotRecordCallback() {@Overridepublic void onScreenshotSuccess(String path, Bitmap bitmap) {//path目前没写(没有保存文件,有需求自行在ScreenshotRecordUtil里startCapture方法实现),//这里是直接获取的bitmap显示//在主线程更新UIrunOnUiThread(new Runnable() {@Overridepublic void run() {//Glide.with(Live2Activity.this).load(bitmap).into(image);}});}@Overridepublic void onScreenshotFailure() {//截图失败}@Overridepublic void onRecordStart() {//录屏开始//LogUtils.d("录屏开始:");}@Overridepublic void onRecordStop(String path) {//录屏结束//LogUtils.d("录屏结束:"+path);}});

2.实现onActivityResult方法

 @RequiresApi(api = Build.VERSION_CODES.O)@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == ScreenshotRecordUtil.REQUEST_SHOT_CODE && resultCode == RESULT_OK) {// 获取申请截屏结果screenshotRecordUtil.setUpImageProjection(Live2Activity.this, resultCode, data);} else if (requestCode == ScreenshotRecordUtil.REQUEST_RECORD_CODE && resultCode == RESULT_OK) {// 获取申请录屏结果//录屏文件存储目录地址String root = Environment.getExternalStorageDirectory() + AppConstants.PATH_VIDEO);File appDir = new File(root);if (!appDir.exists()) {appDir.mkdirs();}//创建文件File file = new File(appDir, System.currentTimeMillis() + ".mp4");screenshotRecordUtil.setUpVideoProjection(Live2Activity.this, resultCode, data, file);}}

3.点击按钮,截屏

   /*** 截取屏幕* REQUEST_SHOT_CODE 是请求码,和你的重复了可以自己更改*/@OnClick(R.id.btn_screenshot)void screenshot() {screenshotRecordUtil.screenCapture(ScreenshotRecordUtil.REQUEST_SHOT_CODE);}

4.点击按钮,录屏

   /*** 录屏*/@OnClick(R.id.btn_recording)void onClickRecording() {if (screenshotRecordUtil.isRecording()) {screenshotRecordUtil.mediaRecorderStop();} else {screenshotRecordUtil.screenCapture(ScreenshotRecordUtil.REQUEST_RECORD_CODE);}}

ScreenshotRecordUtil 类:


import static android.content.Context.WINDOW_SERVICE;import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.ThreadUtils;import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;/*** 截屏录屏工具* <p>* 1.申请录屏Intent* <p>* 2.然后调用activity的 startActivityForResult(screenCaptureIntent,code);* <p>* 3.onActivityResult获取屏幕录制的操作对象* mMediaProjection = mediaProjectionManager.getMediaProjection(resultCode, resultData);* <p>* 4.MediaProjection + VirtualDisplay + Surface(根据情况使用提供者) 实现录屏截屏功能*/
public class ScreenshotRecordUtil {private static final String TAG = ScreenshotRecordUtil.class.getSimpleName();public static final int REQUEST_SHOT_CODE = 10011;//截屏请求回调codepublic static final int REQUEST_RECORD_CODE = 10012;//录屏请求回调codeprivate MediaRecorder mMediaRecorder;                                                           //MediaRecorder屏幕录制 需求场景是把屏幕录制成文件,录屏直播则使用MediaCodec或者大名鼎鼎的FFmpegprivate ImageReader mImageReader;                                                               //获取屏幕渲染得到Imageprivate MediaProjectionManager mediaProjectionManager;                                          //系统提供的一个录屏服务private MediaProjection mMediaProjection;                                                       //屏幕录制的操作对象private VirtualDisplay mVirtualDisplay;                                                         //虚拟屏幕——VirtualDisplayprivate String mVideoPath;                                                                      //录像输入地址private Activity activity;private Intent screenCaptureIntent;private ScreenshotRecordCallback screenshotRecordCallback;/*** 申请录屏Intent*/public void screenCaptureIntent(Activity activity, ScreenshotRecordCallback screenshotRecordCallback) {this.activity = activity;this.screenshotRecordCallback = screenshotRecordCallback;this.mediaProjectionManager = (MediaProjectionManager) activity.getSystemService(Context.MEDIA_PROJECTION_SERVICE);this.screenCaptureIntent = mediaProjectionManager.createScreenCaptureIntent();}/*** 调用activity的 startActivityForResult*/public void screenCapture(int code) {this.activity.startActivityForResult(screenCaptureIntent, code);}/*** 获取屏幕截图** @param activity   activity* @param resultCode onActivityResult返回的 resultCode* @param resultData onActivityResult返回的 resultData*/public void setUpImageProjection(Activity activity, int resultCode, Intent resultData) {//创建mImageReader,用于获取VirtualDisplay的imageDisplayMetrics displayMetrics = new DisplayMetrics();WindowManager windowManager = (WindowManager) activity.getSystemService(WINDOW_SERVICE);windowManager.getDefaultDisplay().getMetrics(displayMetrics);int width = displayMetrics.widthPixels;int height = displayMetrics.heightPixels;Log.e(TAG, "displayMetrics width=" + width + ", height=" + height);this.mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);//获取屏幕录制的操作对象this.mMediaProjection = mediaProjectionManager.getMediaProjection(resultCode, resultData);//创建虚拟屏幕,使用ImageReader提供的Surface//VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR:当没有内容显示时,允许将内容镜像到专用显示器上。//VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY:仅显示此屏幕的内容,不镜像显示其他屏幕的内容。//VIRTUAL_DISPLAY_FLAG_PRESENTATION:创建演示文稿的屏幕。//VIRTUAL_DISPLAY_FLAG_PUBLIC:创建公开的屏幕。//VIRTUAL_DISPLAY_FLAG_SECURE:创建一个安全的屏幕this.mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture",width, height,displayMetrics.densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mImageReader.getSurface(), null, null);//这里稍稍作了个延时,立马取的话 mImageReader.acquireLatestImage()可能为空ThreadUtils.executeByCachedWithDelay(new ThreadUtils.SimpleTask<Object>() {@Overridepublic Object doInBackground() throws Throwable {startCapture();return null;}@Overridepublic void onSuccess(Object result) {}}, 100, TimeUnit.MILLISECONDS);}/*** 屏幕录制** @param activity   activity* @param resultCode onActivityResult返回的 resultCode* @param resultData onActivityResult返回的 resultData* @param file       录制输出文件*/public void setUpVideoProjection(Activity activity, int resultCode, Intent resultData, File file) {//创建mImageReader,用于获取VirtualDisplay的imageDisplayMetrics displayMetrics = new DisplayMetrics();WindowManager windowManager = (WindowManager) activity.getSystemService(WINDOW_SERVICE);windowManager.getDefaultDisplay().getMetrics(displayMetrics);int width = displayMetrics.widthPixels;int height = displayMetrics.heightPixels;Log.e(TAG, "displayMetrics width=" + width + ", height=" + height);initMediaRecorder(file, width, height);//获取屏幕录制的操作对象this.mMediaProjection = mediaProjectionManager.getMediaProjection(resultCode, resultData);//创建虚拟屏幕 需要在mMediaRecorder.prepare();后,否则mMediaRecorder.getSurface()拿不到Surface对象this.mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenRecorder",width, height,displayMetrics.densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mMediaRecorder.getSurface(), null, null);mediaRecorderStars();}/*** 截图*/public void startCapture() {String mImageName = System.currentTimeMillis() + ".png";Log.i(TAG, "image name is : " + mImageName);Image image = mImageReader.acquireLatestImage();if (image == null) {Log.e(TAG, "image is null.");if (screenshotRecordCallback != null) {screenshotRecordCallback.onScreenshotFailure();}return;}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 mBitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);mBitmap.copyPixelsFromBuffer(buffer);mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, width, height);image.close();if (mBitmap != null) {// 保存或者显示...if (screenshotRecordCallback != null) {screenshotRecordCallback.onScreenshotSuccess(null, mBitmap);}}}/*** 录屏*/private void initMediaRecorder(File file, int width, int height) {this.mMediaRecorder = new MediaRecorder();// 设置音频来源 需要动态申请 android.permission.RECORD_AUDIO 权限this.mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置视频来源this.mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);// 设置输出格式this.mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 设置输出文件this.mVideoPath = file.getAbsolutePath();this.mMediaRecorder.setOutputFile(mVideoPath);// 设置视频宽高this.mMediaRecorder.setVideoSize(width, height);// 设置视频帧率this.mMediaRecorder.setVideoFrameRate(30);// 设置视频编码比特率this.mMediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);// 设置音频编码this.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);// 设置视频编码this.mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);try {this.mMediaRecorder.prepare();} catch (IOException e) {e.printStackTrace();}}//通过mVideoPath地址确定是否在录屏public boolean isRecording() {Log.e(TAG, "mVideoPath is " + mVideoPath + ",b:" + StringUtils.isEmpty(mVideoPath));return !StringUtils.isEmpty(mVideoPath);}//开始录制public void mediaRecorderStars() {if (StringUtils.isEmpty(mVideoPath)) {Log.e(TAG, "mVideoPath is null");return;}if (mMediaRecorder == null) {Log.e(TAG, "mMediaRecorder is null");return;}mMediaRecorder.start();if (screenshotRecordCallback != null) {screenshotRecordCallback.onRecordStart();}}//结束录制public void mediaRecorderStop() {if (mMediaRecorder != null) {mMediaRecorder.stop();if (screenshotRecordCallback != null) {screenshotRecordCallback.onRecordStop(mVideoPath);}mVideoPath = null;mMediaRecorder.reset();} else {Log.e(TAG, "mMediaRecorder is null");}}/*** 释放相关资源*/public void release() {if (mImageReader != null) {mImageReader.close();}if (mMediaRecorder != null) {mMediaRecorder.setOnErrorListener(null);mMediaProjection.stop();mMediaRecorder.reset();mMediaRecorder.release();}if (mVirtualDisplay != null) {mVirtualDisplay.release();mVirtualDisplay = null;}if (mMediaProjection != null) {mMediaProjection.stop();mMediaProjection = null;}}public interface ScreenshotRecordCallback {void onScreenshotSuccess(String path, Bitmap bitmap);void onScreenshotFailure();void onRecordStart();void onRecordStop(String path);}

为了向别人、向世界证明自己而努力拼搏,而一旦你真的取得了成绩,才会明白:人无须向别人证明什么,只要你能超越自己。

简单屏幕录制截屏工具相关推荐

  1. 简单的python截屏工具

    今天突然想到python怎么实现截屏功能,于是在网络上搜集一下. 简单的截屏功能 #!/user/bin/env python #-*-coding: utf-8-*- #@Time : 2020/9 ...

  2. Tools_@截屏工具@OCR识别工具@图片文字翻译工具长截屏,普通截屏套件推荐(by QQ)@鼠标键盘动作录制

    文章目录 Tools_@截屏工具@OCR识别工具@图片文字翻译工具长截屏,普通截屏套件推荐(QQ自带) 全局录屏/长截屏: OCR 优点 不足 quicker动作 鼠键录制工具

  3. adb 获取手机屏幕内容 截屏录制视频

    adb 获取手机屏幕内容 截屏录制视频 官方文档 安装 屏幕截图获取 连接设备到adb,使用命令查看:·adb devices adb shell screencap /sdcard/screen.p ...

  4. mac idea用自带的maven还是_苹果电脑自带截图工具怎么用?mac自带截屏工具使用技巧分享

    一说到截图工具我们脑袋里最先跳出来应该是 QQ 和微信等社交软件自带的截图工具,这里小编为大家推荐的是经常被忽昭略的mac自带截屏工具.也许你想不到苹果自带截图工具功能是十分的强大的. mac自带截屏 ...

  5. 如何使用recordMyDesktop录制截屏视频

    开源社区管理的一个重要方面是为您的项目软件提供升级,使新用户尽可能容易地找到您的软件,理解它并将其应用于自己的用例. 许多社区领导者所吸引的方法之一是创建在线视频,这些视频以清晰,易于理解的叙述突出显 ...

  6. 绿色抓屏截屏工具:FastStoneCapture

    FastStoneCapture下载 软件是绿色版本,下载后直接打开即可 链接:绿色抓屏截屏工具FastStoneCapture下载地址 提取码:ebxy FastStoneCapture安装 下载后 ...

  7. 截屏工具Snipaste使用指南

    Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏.标注等功能. 开始截图 快捷键(默认为 F1) 鼠标左键 单击托盘图标 何为一次成功的截图 保存到剪贴板 ( Ctrl + C / E ...

  8. UEFI开发探索99 – UEFI Shell下截屏工具

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI Shell下截屏工具 1 PrintScreenLogger的代码结构 1)Print ...

  9. linux截屏软件,简介Linux截屏工具:import

    现在很多人都安装了Linux,在应用Linux会遇到很多问题,本文为你详细介绍Linux截屏工具,为你在学习Linux截屏工具时起一定的作用.在Linux中,最简单的截屏工具莫过于import了. 几 ...

  10. 录屏软件有哪些?分享几种简单实用的录屏工具

    有哪些好用的录屏软件呢?如果你需要向他人展示如何操作一个软件或者如何进行某项任务,录制一个演示视频是非常有用的.你可以在视频中演示每个步骤,然后分享给你的观众.这对于教育和培训领域非常有用,因为它可以 ...

最新文章

  1. 9大跨平台移动 App 开发工具推荐
  2. 本地连接出来的很慢解决方法
  3. 推荐系统炼丹笔记:阿里推荐算法特征交叉新方式CAN
  4. Difference: throw or throw ex?
  5. The Economist经济学人是如何使用Go语言构建内容平台微服务架构的?
  6. android so导致启动慢,谈谈Android NDK中动态链接库(.so文件)的优化
  7. Android应用开发初印象
  8. 手机电脑投屏软件_手机投屏电脑,电脑控制手机,推荐这款良心免费的软件
  9. 容器技术Docker K8s 5 容器技术在阿里巴巴落地历程
  10. 倍福twincat3软件下载方式
  11. CwRsync | Windows与Windows之间同步备份配置详解
  12. pandas学习task05变形
  13. RDS-TMC(Traffic Message Channel)蕴藏的商机不可小视
  14. Mac平台上有哪些好用的常用软件?
  15. PHP使用socks5代理发送邮件
  16. python地图实例_利用pyecharts实现地图可视化的例子
  17. 马斯克的脑机接口,一块树莓派就能做出来?
  18. 9-5 删除字符串中指定字符
  19. 初次注册知乎账号,不小心遭受系统限制,该如何解封?
  20. win10常用电脑快捷操作;gif工具推荐

热门文章

  1. 数据字典chm制作教程
  2. 第11.25节 Python正则表达式编译re.compile及正则对象使用
  3. CLC龍链:致力于打造支付生态系统
  4. 企业微信sdk调用,通过手机号或微信好友添加客户
  5. 齐齐哈尔大学计算机考研论坛,2020年一志愿报考齐齐哈尔大学硕士研究生进入复试的考生名单...
  6. 当黑客被抓是种怎样的体验?
  7. 防火墙互联网的几种接入方式
  8. DBSCAN 对点云障碍物聚类
  9. QQ VS 360事件全部经过!-----现实生活中的MBA经典案例!
  10. 菜菜的刷题日记 | 215. 数组中的第K个最大元素