MediaProjection + VirtualDisplay
有关的类
- MediaProjectionManager
- MediaProjection
- VirtualDisplay
- SurfaceView
- Sruface
MediaProjectionManager是个系统级服务,同TelephoneManager一样,通过getSystemService()方法获取;
MediaProjection 实现截屏和录屏的类
VirtualDisplay显示截屏
用SurfaceView来显示,
获取Surface
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
Surface surface = surfaceView.getHolder().getSurface();
获取DPI
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int ensityDpi = metrics.densityDpi;
获取MediaProjectionManager
MediaProjectionManager mediaManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
分“开始”+“结束”选项
开始的代码见下方,if else判断逻辑还没搞懂,先放着吧
if (surface == null) {
LogUtil.d(TAG, "surface == null");
return;
}
if (mediaProjection != null) {
createVirtualDisplay();
} else if (mResultCode != 0 && mResultData != null) {
getMediaProjection();
createVirtualDisplay();
} else {
startActivityForResult(mediaManager.createScreenCaptureIntent(), 1);//createScreenCaptureIntent() API>=21
}
createVirtualDisplay()
VirtualDisplay mVirtualDisplay = mediaProjection.createVirtualDisplay("VirtualDisplay01", surfaceView.getWidth(),
surfaceView.getHeight(), densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null);
getMediaProjection()
MediaProjection mediaProjection = mediaManager.getMediaProjection(mResultCode, mResultData);
关闭 stopScreenCapture();
关闭的是VirtualDisplay
if (mVirtualDisplay != null) {
mVirtualDisplay.release();//API>=19
mVirtualDisplay = null;
}
onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if (resultCode != RESULT_OK) {
LogUtil.d(TAG, "用户点击了取消");
return;
}
mResultCode = resultCode;
mResultData = data;
getMediaProjection();
createVirtualDisplay();
}
}
销毁
@Override
protected void onPause() {
super.onPause();
if (mVirtualDisplay != null) {
mVirtualDisplay.release();//API>=19
mVirtualDisplay = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaProjection != null) {
mediaProjection.stop();
mediaProjection = null;
}
}
其它
Demo: http://git.oschina.net/AndroidUI/ScreenCapture01
google sample:https://github.com/googlesamples/android-ScreenCapture
Android视频录制--MediaProjection