@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 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); } } private VirtualDisplay mVirtualDisplay; @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @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); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.KITKAT) 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); /* try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } Image image = imageReader.acquireNextImage(); 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() + "/hello.jpg"; //bitmap保存为图片 saveBitmap(bitmap, filePath); Toast.makeText(Main2Activity.this, "图片保存成功", Toast.LENGTH_SHORT).show(); image.close(); mVirtualDisplay.release(); mVirtualDisplay = null; */ imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireNextImage(); 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() + "/hello.jpg"; //bitmap保存为图片 saveBitmap(bitmap, filePath); Toast.makeText(Main2Activity.this, "图片保存成功", Toast.LENGTH_SHORT).show(); image.close(); if (mVirtualDisplay!=null) { mVirtualDisplay.release(); mVirtualDisplay = null; } } }, 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(); } catch (IOException e) { e.printStackTrace(); } }
在Activity中调用startScreenShot()即可,亲测可用。记住,截取的是整个设备的屏幕