使用MediaprojectionManager 的方法来进行屏幕捕捉,VirtualDisplay来展示捕捉的屏幕截图,关键代码为:
实例化视频放映管理器
通过startActivityForResult开始捕捉屏幕projectionManager = (MediaProjectionManager) getSystemService( Context.MEDIA_PROJECTION_SERVICE);
Intent intent = projectionManager.createScreenCaptureIntent(); startActivityForResult(intent,CAPTURE_CODE);
// 在onActivityResult中对传来的捕捉屏幕数据进行展示
projection = projectionManager.getMediaProjection(resultCode,data);
virtualDisplay = projection.createVirtualDisplay("屏幕捕捉",displayWidth,displayHeight, screenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,surface, null,null);
具体代码如下:
public class ScreenCapture extends Activity implements View.OnClickListener{
// 定义屏幕捕获的请求码
private static final int CAPTURE_CODE = 0x123;
private MediaProjectionManager projectionManager;
private int screenDensity;
private int displayWidth = 500;
private int displayHeight = 670;
private Surface surface;
private SurfaceView surfaceView;
private ToggleButton capture;
private boolean isSharing = false;
private MediaProjection projection;
private VirtualDisplay virtualDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_capture);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
capture = (ToggleButton) findViewById(R.id.capture);
surface = surfaceView.getHolder().getSurface();
// 获取屏幕分辨率
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenDensity = metrics.densityDpi;
// 控制SurfaceView组件的宽高
ViewGroup.LayoutParams lp = surfaceView.getLayoutParams();
lp.width = displayWidth;
lp.height = displayHeight;
surfaceView.setLayoutParams(lp);
projectionManager = (MediaProjectionManager) getSystemService(
Context.MEDIA_PROJECTION_SERVICE);
capture.setOnClickListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(projection != null){
projection.stop();
projection = null;
}
}
@Override
public void onClick(View v) {
if(((ToggleButton)v).isChecked()){
shareScreen();
}else{
stopScreenSharing();
}
}
//
private void shareScreen(){
isSharing = true;
if(surface == null)
return;
if(projection == null){
Intent intent = projectionManager.createScreenCaptureIntent();
startActivityForResult(intent,CAPTURE_CODE);
return;
}
}
private void stopScreenSharing(){
isSharing = false;
if(virtualDisplay == null){
return;
}
virtualDisplay.release();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CAPTURE_CODE){
// 若用户取消了屏幕捕捉
if(resultCode != RESULT_OK){
Toast.makeText(ScreenCapture.this, "用户取消屏幕捕捉", Toast.LENGTH_SHORT).show();
}
projection = projectionManager.getMediaProjection(resultCode,data);
virtualDisplay = projection.createVirtualDisplay("屏幕捕捉",displayWidth,
displayHeight, screenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,surface, null,null);
}
}
}