Android MediaProjection 录屏

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结束录制。

作者:魏超凡:原文地址

你可能感兴趣的:(Android MediaProjection 录屏)