int width,height,dpi=0;
boolean isScreenSuccess = false;
MediaProjectionManager mediaProjectionManager;
VirtualDisplay mVirtualDisplay;
private void startScreenShot(){
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
width = displayMetrics.widthPixels;
height = displayMetrics.heightPixels;
dpi = displayMetrics.densityDpi;
}
mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
if (mediaProjectionManager != null) {
startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 123);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
if (mediaProjection != null){
getBitmap(mediaProjection);
}
}
private void getBitmap(MediaProjection mediaProjection){
ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 3);
mVirtualDisplay = mediaProjection.createVirtualDisplay("screen_shot",
width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
imageReader.getSurface(), null, null);
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
if(isScreenSuccess){
stopScreenCapture();
}else{
try {
//此处睡眠是因为可能会截屏到用户提示
Thread.sleep(1500);
}catch (Exception e){
e.printStackTrace();
}
startScreenCapture(reader);
}
}
}, null);
}
private void saveBitmap(Bitmap bitmap, String filePath){
try {
FileOutputStream outputStream = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
isScreenSuccess = true;
ToastOrLogUtils.showLongToast(this,"截图保存成功:"+filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
private void startScreenCapture(ImageReader imageReader){
Image image = imageReader.acquireNextImage();
// Image image = imageReader.acquireNextImage();
// Image image = imageReader.acquireLatestImage();
if(image == null){
Log.e(TAG,"image is null");
return;
}
int width = image.getWidth();
int height = image.getHeight();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * width;
Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
String filePath = Environment.getExternalStorageDirectory().getPath() + "/screenShot.jpg";
//bitmap保存为图片
saveBitmap(bitmap, filePath);
image.close();
}
private void stopScreenCapture() {
if (mVirtualDisplay != null) {
mVirtualDisplay.release();
mVirtualDisplay = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
stopScreenCapture();
}
isScreenSuccess 参数用来控制是否继续截屏
调用方式
isScreenSuccess = false;
startScreenShot();