录制Android屏幕内容的解决办法
10年的拉孜网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整拉孜建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“拉孜网站设计”,“拉孜网站推广”以来,每个客户项目都认真落实执行。
首先,下载adb工具到电脑本地并解压缩到某个盘符的根目录(本文以G盘为例)(图1)。接下来,请打开手机的USB调试模式(在开发者选项中,如果设置中没有找到,请进入系统版本信息界面狂点版本号即可进入开发者模式),通过USB线连接电脑,当屏幕出现“允许USB调试吗”的提示时选择是。
重新回到电脑端,同时按下“Win+R”键输入“cmd”进入命令提示符界面,依次输入“G:”(进入保存有adb工具的盘符),回车;“cd adb”(进入cdb文件夹),回车;“adb devices”(连接手机),回车;“adb shell screenrecord /sdcard/movie.mp4”(开始录制,注意screenrecord与/间有空格,movie为文件名),回车(图2)。此时,你就可以对手机进行操作了,而屏幕所显示的所有内容都将会被记录成视频。当你想结束录制时,只需在电脑上按“ctrl+c”键即可,视频文件会保存在手机的根目录下(图3)。
Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限,比较麻烦不容易实现。但是从 5.0 开始,系统提供给了 app 录制屏幕的一系列方法,不需要 root 权限,只需要用户授权即可录屏,相对来说较为简单。本文是在参考了网络上其他录屏资料后完成的, 感谢 。以下将介绍开发录屏功能的一系列步骤以及实现过程中所遇到的一些需要注意的事项。
因为录制用到麦克风,所以需要加上 AUDIO 权限,
如果开发的 app targetApi 在 6.0 以上时,还需要动态获取权限。
这里先介绍 MediaProjectionManager , MediaProjectionManager 是系统提供的一种服务,当我们拿到这个服务对象,可以创建一个 Intent ,通过这个 Intent 可以启动一个弹框样式的 Activity,如果用户授权了,那我们便可以继续下一步屏幕录制。需要说明的是,Intent 是去启动另一个 Activity 的,有极少极少的机型是没有对应的授权Activity 的,所以这里需要多加判断,防止应用奔溃。
即使用户授权了,同意录制操作,仍然需要捕获异常,因为有可能会出现这样一种情况,就是用户在同意录屏的时候系统也正在录屏,录屏操作冲突了。
这一步是整个录屏操作最为关键的一步!我们初始化了 MediaRecorder,设置了是否录上声音、录屏文件格式、录屏文件路径、音视频的编码器、比特率、视频帧率等
然后将在步骤 3 中的 resultCode 以及 data 作为必要的参数通过 MediaProjectionManager 创建 VirtualDisplay。VirtualDisplay 可以理解为虚拟的呈现器,它可以捕获屏幕上的内容,并将其捕获的内容渲染到 Surface 上(Surace 由 MediaRecorder 提供,通过 getSurface() 方法得到),MediaRecorder 再进一步将其封装处理为 Mp4 文件。
经过以上步骤 prepare 之后,当再次调用 MediaRecorder.start() 就可以开始录屏了,这里同意也需要注意的时,调用 start() 方法开始录屏之后,不能立即调用 stop()方法停止录屏,否则会奔溃。测试在测试录屏功能时立马停止录屏,应用奔溃,一直找不到原因。直到看到了源码( API 26 )里的注释
所以为了反正奔溃,在 stop 的时候捕获异常,并且置空 MediaRecorder,下次录屏的时候再重新生成 MediaRecorder。
由于知识水平有限,难免有错误遗漏,欢迎指正!项目地址为 屏幕录制
有时候会用到颜色拾取器这样的东西来查看屏幕上的颜色值,一直是用Pixolor这个软件来看颜色的;很方便,点哪里显示哪里,也没有延迟,以为是什么黑科技;我注意到一个细节,如果只是切换屏幕,颜色拾取器不会更新,只有移动拾取器才更新选中;可以确定是截屏来实现的了,那就简单了,截屏获取像素点的颜色值就好了
网上看了一下,截屏大概分为保存View为图像和调用录屏服务两种办法,录屏是比较好的办法,可以在APP外截屏,所以简单的封装了一下
Step 1. Add the JitPack repository to your build file
Step 2. Add the dependency
主要分为两步,第一步是开启录屏;第二步就可以直接获取截屏,返回Bitmap
截图的过程录屏是开启的,录屏开启就可以进行截屏,操作完需要关闭录屏
截屏过程很快,效果很好
如果是APP外截屏则开启悬浮窗服务,可以通过操作悬浮窗进行截屏
参考文章: Android 截屏方式整理 、 Android录屏(5.0+)
1.初始化一个 MediaProjectionManager
2.创建并启动 Intent
3.在 onActivityResult 中拿到MediaProjection
4.设置VirtualDisplay将图像和展示的View关联起来。一般来说我们会将图像展示到SurfaceView,这里为了为了便于拿到截图,我们使用ImageReader,他内置有SurfaceView。
5.通过ImageReader拿到截图
6.注意截屏之后要及时关闭VirtualDisplay ,因为VirtualDisplay 是十分消耗内存和电量的。
录屏和截屏差不多,只是截屏的时候只是设置了一个ImageReader去获取图像数据,而录屏是设置一个 SurfaceView 去接收内容,获取视频流,然后通过 MediaCodec 来实现视频的硬编码,然后保存为视频文件
初始化录屏的大小和码率
开始录屏,设置输出文件
停止录屏
参考文章: Android视频录制--屏幕录制
1.在 AndroidManifest 中添加权限,Android 6.0 加入的动态权限申请,如果应用的 targetSdkVersion 是 23,申请敏感权限还需要动态申请
中间操作和截屏一样,就是准备开启录屏
5.创建虚拟屏幕,这一步就是通过 MediaProject 录制屏幕的关键所在, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR 参数是指创建屏幕镜像,所以我们实际录制内容的是屏幕镜像,但内容和实际屏幕是一样的,并且这里我们把 VirtualDisplay 的渲染目标 Surface 设置为 MediaRecorder 的 getSurface ,后面我就可以通过 MediaRecorder 将屏幕内容录制下来,并且存成 video 文件
6.录制屏幕数据,这里利用 MediaRecord 将屏幕内容保存下来
如何用 Android 手机完美录屏
方法一:菜单栏录屏
下拉手机屏幕,找到“屏幕录制”快捷按钮,如果没有找到,可以查看菜单或者设置里,找到“屏幕录制”,如果手机不支持录屏的话。可以使用第三方的录屏工具。
方法二:其他录屏
1、首先,在自己的手机应用商店或者百度搜索“迅捷录屏大师”,然后运行软件,选择想要的录屏方式;
2、然后,选择想要录制视频的画质,手机的内存若是有限制的话,高清录屏就能满足需求了。
3、可以看到界面中“录屏悬浮窗”的选项,建议开启以助我们在录屏过程中实现一些简单的操作。
4、最后准备就绪,我们就可以直接点击“开始屏幕录制”。
5、录屏过程中假如出现什么问题,可利用刚刚打开的悬浮窗进行一些简单操作,或者点击中间的按钮暂停录制。
6、录制完毕后,点击悬浮窗的停止按钮或者点击主界面红色按钮,可完成录制。
备注:以上就是如何用安卓手机录屏的方法了,希望对想要录屏的伙伴们有所帮助。
Android 录制视频:
public static voidrecordVideo(Context context, intlimit_time, intsize) {
Intent intent =newIntent();
intent.setAction(MediaStore. ACTION_VIDEO_CAPTURE );
intent.putExtra(MediaStore. EXTRA_VIDEO_QUALITY ,1);
intent.addCategory(Intent. CATEGORY_DEFAULT );
if(size !=0) {
//大小限制是long型,int 型无效,所以后边要写一个L
intent.putExtra(MediaStore. EXTRA_SIZE_LIMIT ,size *1024*1024L);//限制录制大小(10M=10 * 1024 * 1024L)
}
if(limit_time !=0) {
intent.putExtra(MediaStore. EXTRA_DURATION_LIMIT ,limit_time);//限制录制时间(10秒=10)
}
File videoFile =createVideoFile(context);
if(videoFile !=null) {
intent.putExtra(MediaStore. EXTRA_OUTPUT ,Uri.fromFile(videoFile));
context.startActivityForResult(intent, CAPTURE_VIDEO_CODE );
}
}
在Android 4.4(Kitkat - API level 19)上集成了一个比较好用的视频(.mp4格式)录制功能 – screenrecord 。
使用方法
1. 基本用法
$ adb shell screenrecord /sdcard/myscreenrecord.mp4
/sdcard/myscreenrecord.mp4 为视频录制文件路径
录制默认分辨率,默认4Mbps,默认180s的视频,保存到sdcard上名为myscreenrecord.mp4
2. 旋转(参数:–rotate)
$ adb shell screenrecord --rotate /sdcard/myscreenrecord.mp4
旋转90度
3. 指定分辨率(参数:–size)
$adb shell screenrecord --size 112x112 /sdcard/myscreenrecord.mp4
分辨率为112x112,建议不要指定分辨率,使用默认分辨率效果最佳;
注意,分辨率不是完全可以随意定制的,比如在我手机上录制100x100的会提示错误:
The max width/height supported by codec is1920x1088
100x100is not supported by codec, suggest to set it as112x112
4. 指定比特率(参数:–bit-rate)
$adb shell screenrecord --bit -rate 8000000 /sdcard/myscreenrecord.mp4
设置比特率为8Mbps,比特率越大,文件越大,画面越清晰;
5. 限制录制时间 (参数: –time-limit)
$adb shell screenrecord --time -limit 10 /sdcard/myscreenrecord.mp4
限制视频录制时间为10s,如果不限制,默认180s
6. 导出视频
$adb pull /sdcard/myscreenrecord.mp4
7. 注意
请关注视频文件生成大小,根据自身情况而定;
暂不支持声音;
咱时不支持模拟器录制( 模拟器录制看这里 ),出现如下提示:Unable to get output buffers (err=-38)
Encoder failed (err=-38),可认为是此原因;
8. 命令查看
adb shell screenrecord --help
Usage: screenrecord [options]
Records the device's display to a .mp4 file.
Options:
--size WIDTHxHEIGHT
Set the video size, e.g."1280x720". Default is the device's main
display resolution (if supported), 1280x720if not. For best
results,use a size supported by the AVC encoder.
--bit -rate RATE
Set the video bit rate, in megabits per second. Default4Mbps.
--time -limit TIME
Set the maximum recording time, in seconds. Default / maximum is180.
--rotate
Rotate the output90 degrees.
--verbose
Display interesting information on stdout.
--help
Showthis message.
Recording continues until Ctrl-C is hit or the time limit is reached.