Android5.0免Root截屏,录屏

http://blog.csdn.net/wds1181977/article/details/52174840

MediaProjection介绍

MediaProjection可以用来捕捉屏幕,具体来说可以截取当前屏幕和录制屏幕视频。MediaProjection由MediaProjectionManager来管理和获取。

使用步骤

首先获取MediaProjectionManager,和其他的Manager一样通过 Context.getSystemService() 传入参数MEDIA_PROJECTION_SERVICE获得实例。

接着调用MediaProjectionManager.createScreenCaptureIntent()弹出dialog询问用户是否授权应用捕捉屏幕,同时覆写onActivityResult()获取授权结果。

如果授权成功,通过MediaProjectionManager.getMediaProjection(int resultCode, Intent resultData)获取MediaProjection实例,通过MediaProjection.createVirtualDisplay(String name, int width, int height, int dpi, int flags, Surface surface, VirtualDisplay.Callback callback, Handler handler)创建VirtualDisplay实例。实际上在上述方法中传入的surface参数,是真正用来截屏或者录屏的。

截屏

截屏这里用到ImageReader类,这个类的getSurface()方法获取到surface直接传入MediaProjection.createVirtualDisplay()方法中,此时就可以执行截取。通过ImageReader.acquireLatestImage()方法即可获取当前屏幕的Image,经过简单处理之后即可保存为Bitmap。

           private void startCapture() {

            mImageName = System.currentTimeMillis() + ".png";

            Log.e(TAG, "image name is : " + mImageName);

            Image image = mImageReader.acquireLatestImage();

            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);

            bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);

            image.close();

            if (bitmap != null) {

                Log.e(TAG, "bitmap  create success ");

                try {

                    File fileFolder = new File(mImagePath);

                    if (!fileFolder.exists())

                        fileFolder.mkdirs();

                    File file = new File(mImagePath, mImageName);

                    if (!file.exists()) {

                        Log.e(TAG, "file create success ");

                        file.createNewFile();

                    }

                    FileOutputStream out = new FileOutputStream(file);

                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);

                    out.flush();

                    out.close();

                    Log.e(TAG, "file save success ");

                    Toast.makeText(this.getApplicationContext(), "截图成功", Toast.LENGTH_SHORT).show();

                } catch (IOException e) {

                    Log.e(TAG, e.toString());

                    e.printStackTrace();

                }

            }

        }

录屏

录屏需要用到上篇博文中的MediaCadec,这个类将原始的屏幕数据编码,在通过MediaMuxer分装为mp4格式保存。MediaCodec.createInputSurface()获取一个surface对象讲起传入MediaProjection.createVirtualDisplay()即可获取屏幕原始多媒体数据,之后读取MediaCodec编码输出数据经过MediaMuxer封装处理为mp4即可播放,实现录屏。

       private void recordVirtualDisplay() {//循环多去编解码器输出数据经过处理保存为mp4

        while (!mIsQuit.get()) {

            int index = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 10000);

            Log.i(TAG, "dequeue output buffer index=" + index);

            if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {//后续输出格式变化

                resetOutputFormat();

            } else if (index == MediaCodec.INFO_TRY_AGAIN_LATER) {//请求超时

                Log.d(TAG, "retrieving buffers time out!");

                try {

                    // wait 10ms

                    Thread.sleep(10);

                } catch (InterruptedException e) {

                }

            } else if (index >= 0) {//有效输出

                if (!mMuxerStarted) {

                    throw new IllegalStateException("MediaMuxer dose not call addTrack(format) ");

                }

                encodeToVideoTrack(index);

                mMediaCodec.releaseOutputBuffer(index, false);

            }

        }

    }

        private void encodeToVideoTrack(int index) {//输出数据为mp4文件

        ByteBuffer encodedData = mMediaCodec.getOutputBuffer(index);

        if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {//是特定格式信息等配置数据,不是媒体数据

            // The codec config data was pulled out and fed to the muxer when we got

            // the INFO_OUTPUT_FORMAT_CHANGED status.

            // Ignore it.

            Log.d(TAG, "ignoring BUFFER_FLAG_CODEC_CONFIG");

            mBufferInfo.size = 0;

        }

        if (mBufferInfo.size == 0) {

            Log.d(TAG, "info.size == 0, drop it.");

            encodedData = null;

        } else {

            Log.d(TAG, "got buffer, info: size=" + mBufferInfo.size

                    + ", presentationTimeUs=" + mBufferInfo.presentationTimeUs

                    + ", offset=" + mBufferInfo.offset);

        }

        if (encodedData != null) {//存在编码数据

            encodedData.position(mBufferInfo.offset);

            encodedData.limit(mBufferInfo.offset + mBufferInfo.size);

            mMuxer.writeSampleData(mVideoTrackIndex, encodedData, mBufferInfo);//写入

            Log.i(TAG, "sent " + mBufferInfo.size + " bytes to muxer...");

        }

    }

        private void resetOutputFormat() {

        // should happen before receiving buffers, and should only happen once

        if (mMuxerStarted) {

            throw new IllegalStateException("output format already changed!");

        }

        MediaFormat newFormat = mMediaCodec.getOutputFormat();

        Log.i(TAG, "output format changed.\n new format: " + newFormat.toString());

        mVideoTrackIndex = mMuxer.addTrack(newFormat);

        mMuxer.start();

        mMuxerStarted = true;

        Log.i(TAG, "started media muxer, videoIndex=" + mVideoTrackIndex);

    }

附录参考

官方文档

Android视频录制

Android 5.0截屏

Android录屏代码 
本文Demo

时间: 2024-07-30 08:55:04

Android5.0免Root截屏,录屏的相关文章

(024)[工具软件]截屏录屏软件FSCapture(转)

该软件比 Snipaste 增加的功能有滚动截图和屏幕录制. 原文地址:https://www.appcgn.com/faststone-capture.html FastStoneCapture,简称:FSCapture,是一款由美利坚 FastStone 软件科技公司精心设计开发的优秀屏幕截图工具,体积小巧.功能精悍,操作简便.不仅具有所有常规屏幕截图方式,还能够从扫描仪获取图像文件,以及将其转换为便携式 PDF 文档等功能,同时也支持对抓取到的图片进行编辑与保存操作. FSCapture 

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

使用ffmpeg将录屏文件转换成gif

一.使用华为nova3 内置录屏软件录屏 1.下拉屏幕上方. 2.选择编辑按钮. 3.点击"屏幕录制". 4.倒计时3-2-1. 5.开始录制. 6.录制完毕时用食指以及中指关节敲打手机屏幕,录制好的文件在"图库"-"截屏录屏"中 二.使用ffmpeg将录制好的macrodroidluping.mp4转换成a.gif格式文件. 1.下载ffmpeg,选择 4.02版本-64bit-static 2.安装ffmpeg,安装在d:\ffmpeg 3.

苹果手机怎样录屏 如何录制手机内容

很多人喜欢将手机投屏到电脑,毕竟是大屏幕,看着也比较赏心悦目.但是需要借助苹果录屏软件,迅捷苹果录屏精灵不仅可以投屏到电脑,同时也可以在线录制手机内容,更加方便于我们的使用,那么苹果手机怎么录屏呢? 使用工具: 电脑苹果手机迅捷苹果录屏精灵 方法/步骤: 1.第一步,这是一个PC端的软件,所以只需要在电脑上下载安装就可以,成功安装之后,打开此软件,可以先登录(验证码或者快捷方式):? 2.第二步,把手机和电脑连接到同一个网络,这是很重要的一步. ? 3.?第三步,在"设置"中修改画质.

iphone手机怎么录屏 两种方法任你挑选

iphone手机怎么录屏呢?苹果手机拥有独特的Airlay镜像投屏,AirPlay的工作原理是当iPhone或IPAD与支持AirPlay技术的硬件,比如Apple TV等设备处在同一个wife的情况下,iPhone或IPAD就会触发AirPlay功能.我们可以通过在电脑上安装支持AirPlay的软件来间接实现这个功能! 使用工具:手机&网络 方法一:手机自带屏幕录制 1.打开iphone手机,进入设置,选择控制中心: 2.在控制中心中,选择自定控制: 3.在自定控制,选择屏幕录制,点击左侧的添

Android5.0录屏方案

导语 本文主要是围绕android直播助手的功能做了一些研究,因为之前对Android多媒体相关的内容知之甚少,只有概念,于是查阅了相关资料并做以总结. 由于我对音视频相关知识零基础所以补充了一些相关知识 视音频编解码技术零基础学习方法 视音频数据处理入门:RGB.YUV像素数据处理 采集音频原始数据---->压缩编码----> 封装 采集视频原始数据---->压缩编码----> 封装 音视频编码 压缩编码就是对数据进行压缩以节省空间便于存储和传输. 视频压缩编码就是将视频帧的像素

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

Android录屏应用开发研究

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