Android录屏流程

1.权限申明

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

2.请求录屏

    private MediaProjectionManager mMediaProjectionManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding=DataBindingUtil.setContentView(this, R.layout.activity_main);
        mBinding.btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
                startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(),
                        REQUEST_MEDIA_PROJECTION);
            }
        });

    }

3.判断录屏请求结果,然后将返回的数据给新创建的后台录屏服务

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case REQUEST_MEDIA_PROJECTION:
                if (resultCode == RESULT_OK && data != null) {
                    RecordService.setResultData(data);
                    startService(new Intent(getApplicationContext(), RecordService.class));
                }
                break;
        }
    }

4.在录屏服务里开启一个线程并初始化ImageReader,MediaProjection,VirtualDisplay

    private void initScreenCapture(){
        mScreenDensity = ScreenUtils.getScreenDensityDpi();
        mScreenWidth = ScreenUtils.getScreenWidth();
        mScreenHeight = ScreenUtils.getScreenHeight();
        mImageReader = ImageReader.newInstance(mScreenWidth, mScreenHeight, PixelFormat.RGBA_8888, 2);
        mMediaProjection =((MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE))
                .getMediaProjection(Activity.RESULT_OK, mResultData);
        mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",
                mScreenWidth, mScreenHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mImageReader.getSurface(), null, null);
    }

5.从ImageReader中获取最新屏幕图像并处理

private boolean getScreenCapture() {
        Image image = mImageReader.acquireLatestImage();
        if (image!=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;
            if (mBitmap==null){
                mBitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
            }
            mBitmap.copyPixelsFromBuffer(buffer);
            image.close();
            return true;
        }
        return false;
    }

6.最后记得释放VirtualDisplay,MediaProjection

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mVirtualDisplay == null) {
            return;
        }
        mVirtualDisplay.release();
        mVirtualDisplay = null;

        if (mMediaProjection != null) {
            mMediaProjection.stop();
            mMediaProjection = null;
        }
    }

原文地址:https://www.cnblogs.com/Potato-Eater/p/9678282.html

时间: 2024-10-20 09:12:42

Android录屏流程的相关文章

Android录屏应用开发研究

1截屏接口 在Android5.0之前如果希望截图屏幕,是需要获取系统root权限的.但在Android5.0之后Android开放了新的接口android.media.projection,开发者使用该接口,第三方应用程序无需再获取系统root权限也可以直接进行屏幕截图操作了.查询其官方api可知,该接口主要用来"屏幕截图"操作和"音频录制"操作,这里只讨论用于屏幕截图的功能.由于使用了媒体的映射技术手段,故截取的屏幕并不是真正的设备屏幕,而是截取的通过映射出来的

一键生成 Android 录屏 gif 的脚本

目的 编写 bash 脚本, 实现一行命令得到 Android 手机录制屏幕 gif 动图文件. 博主使用 ubuntu 系统, shell 为 bash. 这个脚本也可以用在 mac 系统上. 听说 windows 系统出了 ubuntu on windows, 不知道能不能使用这个脚本. 原理 adb shell screenrecord Android 4.4 版本后系统内预置了一个 screenrecord 命令, 可以用来将屏幕录制为 MP4 格式. 具体命令格式可以通过 –help

Android tips(九)--&gt;Android录屏与转化gif图

转载请标明出处:一片枫叶的专栏 最近有同学问我android手机的录屏以及转化成gif图是如何实现的?今天正好就讲讲android的录屏与转化gif操作.整个Android系统的录制与转化GIF图是分为两个部分,录制过程与转化过程,下面就详细的介绍一下这两个部分的具体过程. android手机的录屏操作 android手机也有一些录制屏幕的软件,但是作为程序员还是推荐使用adb 命令实现对屏幕操作的录制操作的,而下面我们就介绍一下实现屏幕录制功能的adb命令:screenrecord. 关于sc

Android录屏命令、Android录Gif、Android录视频

NoHttp开源地址:https://github.com/yanzhenjie/NoHttp NoHttp具体使用文档已公布,你想知道的全都有,请点我移步! 版权声明:转载请注明本文转自严振杰的博客: http://blog.yanzhenjie.com 演示 大家看博客时常常看到以下这样的图片,都非常想知道怎么做的吧,好在自己写博客时也把操作录下来: 这个图是我还有一个博客的图讲Android三级联动和ListView单选多选的,博客和源代码传送门,如今呢就一步步教大家怎么来做这个图. 上方

Android5.0免Root截屏,录屏

http://blog.csdn.net/wds1181977/article/details/52174840 MediaProjection介绍 MediaProjection可以用来捕捉屏幕,具体来说可以截取当前屏幕和录制屏幕视频.MediaProjection由MediaProjectionManager来管理和获取. 使用步骤 首先获取MediaProjectionManager,和其他的Manager一样通过 Context.getSystemService() 传入参数MEDIA_

Android实现录屏直播(一)ScreenRecorder的简单分析

应项目需求瞄准了Bilibili的录屏直播功能,基本就仿着做一个吧.研究后发现Bilibili是使用的MediaProjection 与 VirtualDisplay结合实现的,需要 Android 5.0 Lollipop API 21以上的系统才能使用. 其实官方提供的android-ScreenCapture这个Sample中已经有了MediaRecorder的实现与使用方式,还有使用MediaRecorder实现的录制屏幕到本地文件的Demo,从中我们都能了解这些API的使用. 而如果需

android 调用 screenrecord 实现录屏

首先要说明的是并未实现,本文讲一下自己的思路. adb 使用shell 命令 screenrecord 可录屏. 自己写了个app,通过Process p = Runtime.getRuntime().exec(cmd)的方式调用shell命令,报错: java.lang.SecurityException: Permission Denial: broadcast asks to run as user -2 but is calling from user 0 需要android.permi

Android免Root录屏

首先确保你的Android系统版本是5.0+ 1.安装一个叫"游视秀"的手机应用,你可以直接扫描下方的二维码下载安装 2.打开“游视秀” 3.点击右上角“录屏”的图标 4.选择一个录屏方式,手机推荐“竖屏录制”平板推荐“横屏录制” 5.选择好录屏方式后会出现桌面会出现悬浮框,点击可以开始录屏,再次点击可以结束录屏 6.啊咧,怎么桌面TM的没有悬浮框啊!!!别着急,在“其他应用管理”->“游视秀”->“权限管理”->“显示悬浮窗”->“允许”,然后再次打开“游视秀

Android系统自带录屏(动态截屏)功能

 Android系统(Android 4.4 或以上)自带有录屏(动态截屏)功能,基于命令行. 具体方法是: adb shell screenrecord /sdcard/myrecord.mp4 这段命令在控制台执行后,Android系统将立即对设备的屏幕录制屏幕的视频.adb shell screenrecord 是执行录屏:sdcard/myrecord.mp4 是视频文件存放的目录,录制后的视频文件存放在sdcard的根目录下,myrecord.mp4即是视频文件. Ctrl + C