返回顶部
首页 > 资讯 > 精选 >android如何实现视频截屏&手机录屏
  • 698
分享到

android如何实现视频截屏&手机录屏

android 2023-05-30 23:05:06 698人浏览 八月长安
摘要

这篇文章主要介绍Android如何实现视频截屏&手机录屏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题在android中有时候我们需要对屏幕进行截屏操作,单一的截屏操作好解决可以通过activity的顶层

这篇文章主要介绍Android如何实现视频截屏&手机录屏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

问题

在android中有时候我们需要对屏幕进行截屏操作,单一的截屏操作好解决可以通过activity的顶层view DecorView获取一个bitmap,得到就是当前activity上面的全部视图。

 View view = activity.getWindow().getDecorView();    view.setDrawinGCacheEnabled(true);    view.buildDrawingCache();    Bitmap bmp = view.getDrawingCache();    DisplayMetrics dm = new DisplayMetrics();    activity.getWindowManager().getDefaultDisplay().getMetrics(dm);    Bitmap ret = Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, dm.heightPixels);    view.destroyDrawingCache();

如果activity中包含一些视频播放器比如SurfaceView GLSurfaceView TextureView,在调用截屏代码会发现播放视频的部分是黑屏的,原因是这几种视频渲染的view通过以上代码拿到的是缓冲区不是真正的图像。

解决办法

android5.0以上系统提供了一个 MediaProjectionManager类来对手机进行录屏操作,也支持获取手机的Image图像的操作,知道了这些我们就可以通过提供的api来进行截屏操作了。

这里通过Service来操作截屏和录屏的api

1.绑定截屏的Service

 Intent intent = new Intent(this, ScreenService.class); bindService(intent, mServiceConnection, BIND_AUTO_CREATE); public void onServiceConnected(ComponentName className, IBinder service) {       DisplayMetrics metrics = new DisplayMetrics();       getWindowManager().getDefaultDisplay().getMetrics(metrics);       ScreenService.RecordBinder binder = (ScreenService.RecordBinder) service;       recordService = binder.getRecordService();       recordService.setConfig(metrics.widthPixels, metrics.heightPixels, metrics.densityDpi);       mButton.setEnabled(true);       mButton.setText(recordService.isRunning() ? "结束" : "开始"); }

2.请求权限 onActivityResult 方法中回调。

 Intent captureIntent = projectionManager.createScreenCaptureIntent(); startActivityForResult(captureIntent, RECORD_REQUEST_CODE);

android如何实现视频截屏&手机录屏

成功后

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {     if (requestCode == RECORD_REQUEST_CODE && resultCode == RESULT_OK) {       //######## 截屏逻辑 ########       mediaProjection = projectionManager.getMediaProjection(resultCode, data);       recordService.setMediaProject(mediaProjection);       recordService.initImageReader();     } }

3. 获取截屏

 @Override public void onClick(View view) {  //######## 截屏逻辑 ########   Bitmap bitmap = recordService.getBitmap();   mImageView.setImageBitmap(bitmap); }

android如何实现视频截屏&手机录屏

录屏

录屏需要初始化一些录屏参数,输入麦克风类型视频类型,保存路径等

 private void initRecorder() {     mediaRecorder.setAudiOSource(MediaRecorder.AudioSource.MIC);     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);     mediaRecorder.setOutputFORMat(MediaRecorder.OutputFormat.THREE_GPP);     mediaRecorder.setOutputFile(         getSavePath() + System.currentTimeMillis() + ".mp4");     mediaRecorder.setVideoSize(width, height);     mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);     mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);     mediaRecorder.setVideoFrameRate(30);     try {       mediaRecorder.prepare();     } catch (IOException e) {       e.printStackTrace();     } }

开始录屏

mediaRecorder.start();

保存路径

android如何实现视频截屏&手机录屏

完整Service代码

public class ScreenService extends Service {private MediaRecorder mediaRecorder;private VirtualDisplay virtualDisplay;private boolean running;private int width = 720;private int height = 1080;private int dpi;private ImageReader mImageReader;private MediaProjection mediaProjection; @Override public IBinder onBind(Intent intent) {   return new RecordBinder(); } @Override public void onCreate() {   super.onCreate();   running = false;   mediaRecorder = new MediaRecorder(); } @Override public int onStartCommand(Intent intent, int flags, int startId) {   return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() {   super.onDestroy(); } public void setMediaProject(MediaProjection project) {   mediaProjection = project; } public boolean isRunning() {   return running; } public void setConfig(int width, int height, int dpi) {   this.width = width;   this.height = height;   this.dpi = dpi; }  public boolean startRecord() {   if (mediaProjection == null || running) {     return false;   }   initRecorder();   createVirtualDisplay();   mediaRecorder.start();   running = true;   return true; }  public boolean stopRecord() {   if (!running) {     return false;   }   running = false;   mediaRecorder.stop();   mediaRecorder.reset();   virtualDisplay.release();   mediaProjection.stop();   return true; } public void setMediaProjection(MediaProjection mediaProjection) {   this.mediaProjection = mediaProjection; }  public void initImageReader() {   if (mImageReader == null) {     int maxImages = 2;     mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, maxImages);     createImageVirtualDisplay();   } }  private void createVirtualDisplay() {   virtualDisplay = mediaProjection       .createVirtualDisplay("mediaprojection", width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder           .getSurface(), null, null); }  private void createImageVirtualDisplay() {   virtualDisplay = mediaProjection       .createVirtualDisplay("mediaprojection", width, height, dpi,           DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader           .getSurface(), null, null); }  private void initRecorder() {   mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);   mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);   mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);   mediaRecorder.setOutputFile(       getSavePath() + System.currentTimeMillis() + ".mp4");   mediaRecorder.setVideoSize(width, height);   mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);   mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);   mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);   mediaRecorder.setVideoFrameRate(30);   try {     mediaRecorder.prepare();   } catch (IOException e) {     e.printStackTrace();   } }  public String getSavePath() {   if (Environment.getExternalStorageState()          .equals(Environment.MEDIA_MOUNTED)) {     String rootDir = Environment.getExternalStorageDirectory()                   .getAbsolutePath() + "/" +         "ScreenRecord" + "/";     File file = new File(rootDir);     if (!file.exists()) {       if (!file.mkdirs()) {         return null;       }     }     return rootDir;   } else {     return null;   } }  public Bitmap getBitmap() {   Bitmap bitmap = cutoutFrame();   if (bitmap == null) {     getBitmap();   }   return bitmap; }  public Bitmap cutoutFrame() {   Image image = mImageReader.acquireLatestImage();   if (image == null) {     return null;   }   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);   return Bitmap.createBitmap(bitmap, 0, 0, width, height); } public class RecordBinder extends Binder {   public ScreenService getRecordService() {     return ScreenService.this;   } }

以上是“android如何实现视频截屏&手机录屏”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: android如何实现视频截屏&手机录屏

本文链接: https://www.lsjlt.com/news/221976.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • android如何实现视频截屏&手机录屏
    这篇文章主要介绍android如何实现视频截屏&手机录屏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题在android中有时候我们需要对屏幕进行截屏操作,单一的截屏操作好解决可以通过activity的顶层...
    99+
    2023-05-30
    android
  • Android 实现屏幕录制和截屏
    在移动开发中,实现屏幕录制和截屏是常见的需求。对于 Android 应用而言,实现屏幕录制和截屏可以帮助开发者更好地测试和调试自己的应用,同时还能够提供一些特定场景下的用户体验。 屏幕录制 Android 应用程序可以通过使用 MediaP...
    99+
    2023-08-18
    android 截屏 录屏
  • Android 录制手机屏幕视频生成GIF图片实例详解
    Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当...
    99+
    2022-06-06
    手机屏幕 手机 Android
  • HTML5怎么在手机端实现视频全屏
    本篇内容主要讲解“HTML5怎么在手机端实现视频全屏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5怎么在手机端实现视频全屏”吧!最近做项目,遇到一个问题,在手机上要实现视频的全屏播放功...
    99+
    2023-06-09
  • Android滚动截屏如何实现
    要实现Android滚动截屏,可以使用以下步骤:1. 获取屏幕的宽度和高度。可以通过以下代码获取:```DisplayMetrics...
    99+
    2023-08-24
    Android
  • android 手机截取长屏实例代码
    最近项目遇到一个需求:把当前页面保存到手机相册。想了想 我还不会呢,就百度了下大神的足迹,踏着大神的足迹,一路向前。废话不说,记录下,后期学习。 public class ScreenUtils {public static Bitmap ...
    99+
    2023-05-31
    android 手机 截取
  • C++如何实现截图截屏
    这篇文章主要介绍了C++如何实现截图截屏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、截图工具1.1 键盘截图(PrtScn键)如何使用Microsoft Windows...
    99+
    2023-06-21
  • 解析Android截取手机屏幕两种实现方案
    最近在开发的过程中,遇到了一个需要截取屏幕保存为图片的需求,具体为截取webview的视图保存图片。 方法1:首先想到的思路是利用SDK提供的View.getDrawingCa...
    99+
    2022-06-06
    手机屏幕 手机 Android
  • React如何自定义视频全屏按钮实现全屏功能
    本篇内容介绍了“React如何自定义视频全屏按钮实现全屏功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、绘制全屏按钮绘制全屏按钮,并绑...
    99+
    2023-07-04
  • Android如何让WebView中的HTML5页面实现视频全屏播放
    前言本文主要是将最近工作中遇到的一个问题进行总结分享,主要介绍的是如何让WebView中H5页面全屏播放视频。关于这个问题,做一下简单分析,希望对大家有所帮助,下面话不多说了,来看看详细的介绍吧。效果图运行效果其实很简单,就是配置问题。关键...
    99+
    2023-05-31
    android webview 视频全屏
  • JavaScript如何实现截屏功能
    小编给大家分享一下JavaScript如何实现截屏功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近参与了网易炉石盒子的相关...
    99+
    2024-04-02
  • Windows7看视频出现绿屏如何解决
    出现绿屏可能是由于以下原因:1. 显卡驱动问题:尝试更新显卡驱动程序,可以在设备管理器中找到显卡,右键单击并选择“更新驱动程序软件”...
    99+
    2023-10-20
    Windows7
  • Android应用中实现截取手机屏幕的方法有哪些
    这篇文章给大家介绍Android应用中实现截取手机屏幕的方法有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法: public ...
    99+
    2023-05-31
    android roi
  • python如何实现的截屏工具
    这篇文章主要介绍python如何实现的截屏工具,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点...
    99+
    2023-06-14
  • Android应用中利用SurfaceView截屏时出现黑屏如何解决
    这期内容当中小编将会给大家带来有关Android应用中利用SurfaceView截屏时出现黑屏如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先看我们一般是怎么用SurfaceView的publi...
    99+
    2023-05-31
    android sur surfaceview
  • Android Socket使用TCP协议实现手机投屏
    本节主要通过实战来了解Socket在TCP/IP协议中充当的是一个什么角色,有什么作用。通过Socket使用TCP协议实现局域网内手机A充当服务端,手机B充当客户端,手机B连接手机A,手机A获取屏幕数据转化为Bitmap,通过Socket传...
    99+
    2023-09-06
    tcp/ip Socket
  • Android如何实现播放视频
    这篇文章将为大家详细讲解有关Android如何实现播放视频,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、通过intent的方式,调用系统自带的播放器  Uri uri&n...
    99+
    2023-05-31
    android
  • Python如何实现录屏功能
    这篇“Python如何实现录屏功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python如何实现录屏功能”文章吧。一、界...
    99+
    2023-07-05
  • Python代码如何实现截屏键盘记录远程发送
    本篇文章为大家展示了Python代码如何实现截屏键盘记录远程发送,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这年头盗号的从出不穷,不是脱裤就是社工钓鱼。今天呢我们就以前面的几篇技术文章做铺垫,来讲...
    99+
    2023-06-17
  • Android中获得手机屏幕大小实现代码
    Android在自定义控件时,经常需要获得屏幕的宽高,每次都要写,不妨直接把他封装成工具类,直接拿来用,废话不说,直接上代码 package com.example.cus...
    99+
    2022-06-06
    手机屏幕 手机 屏幕大小 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作