Android MediaProjection 录屏
Android 4.4录屏可以通过获取root权限,使用adb shell screenrecord命令功能进行录制;而在5.0及以上,可以使用MediaProjection和
VirtualDisplay来录制
MediaProjection用于授予应用捕捉屏幕和记录音频的权利,可以通过createScreenCaptureIntent()来启动屏幕捕获会话。
主要有几个方法:
createVirtualDisplay:创建一个VirtualDisplay用于捕获屏幕的内容。
registerCallback:注册一个监听器以接收关于MediaProjection更改状态的MediaProjection 。
MediaProjectionManager:通过使用参数MEDIA_PROJECTION_SERVICE调用Context.getSystemService()来获取此类的实例。
录屏时实现如下:
首先要申请录制的权限,如果要将其保存在sd卡还要申请相应的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
获取 MediaProjectionManager 实例
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
用createScreenCaptureIntent()发起屏幕捕捉请求,使用此方法可以在录制前先弹出窗口,告知用户要开始录制了,这样会比较好。
REQUEST_CODE值自定义。
startActivityForResult用于回传数据获取intent的结果,采取此方法要实现onActivityResult。
Intent captureIntent= projectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE);
获取屏幕捕捉的结果,通过getMediaProjection来取出intent中的数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECORD_REQUEST_CODE && resultCode == RESULT_OK) {
mediaProjection = projectionManager.getMediaProjection(resultCode, data);
}
}
还可以注册一个监听器接收关于MediaProjection更改状态的
mediaProjection.registerCallback(new MediaProjectionCallback() , null);
createVirtualDisplay()用于创建虚拟屏幕
private void createVirtualDisplay() {
virtualDisplay = mediaProjection.createVirtualDisplay(
"MainScreen",
width,
height,
dpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mediaRecorder.getSurface(),
null, null);
}
用 MediaRecord 保存屏幕的内容,用file获取路径和设置文件名
File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".mp4");
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setVideoSize(width, height);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoFrameRate(30);
MediaRecorder的主要方法有以下:
prepar:准备录制。
start:开始录制。
stop:停止录制。
reset:重置MediaRecorder。
release:释放MediaRecorder的资源。
setAudoSource:设置音频源。
setVideoSource:设置视频源。
setOutoutFormat:设置视频输出格式。
setOutputFile:获取输出路径。
setVideoSize:设置视频尺寸的大小
setPreviewDisplay:设置视频的预览界面。
setVideoEncoder:设置视频编码格式。
setAudioEncoder:设置音频编码格式。
setVideoEncodingBitRate:设置视频编码的码率
setVideoFrameRate:设置视频编码的帧率
setMaxDuration:设置最大记录时长,单位为毫秒。
setPreviewDisplay:设置捕获视频图像的预览界面
使用prepare和mediaRecorder开始录屏。
当录制完后使用stop和release结束录制。
作者:魏超凡:原文地址