从 Android 5.0(API 21) 起,开放了截屏录屏的API,使用到的类有MediaProjectionManager、MediaProjection、VirtualDisplay、ImageReader。
普通截屏大致步骤
① 获取屏幕的长宽高以及densityDpi等,并初始化ImageReader的实例[ 注意获取长宽高的时机 ]
ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
② 获取MediaProjectionManager的实例
MediaProjectionManager manager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
③ 获取截屏的Intent
Intent intent = manager.createScreenCaptureIntent();
④ 启动截屏页面[ MediaProjectionPermissionActivity ]
startActivityForResult(intent, 200);
⑤ 在onActivityResult方法中获取MediaProjection实例
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == 200) {
MediaProjection projection = manager.getMediaProjection(RESULT_OK, data);
}
}
⑥ 获取虚拟显示器VirtualDisplay的实例
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == 200) {
MediaProjection projection = manager.getMediaProjection(RESULT_OK, data);
VirtualDisplay display = projection.createVirtualDisplay("ScreenShot",
width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
imageReader.getSurface(), null, null);
}
}
⑦ 获取截图,bitmap即为所得 [ 注意获取image的时机,我采用了handler.postDelay的方式 ]
Image image = imageReader.acquireLatestImage();
int width = image.getWidth();
int height = image.getHeight();
Image.Plane[] planes = image.getPlanes();
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);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
image.close();
完整示例
我要做的工作是,在Activity创建时就截取屏幕,所以在onCreate方法中就需要获取屏幕的一些相关参数,这里我使用了如何合理地获取屏幕的宽高中的第二种方法,采用handler.postDelayed(Runnable r, long delayMillis) 方法。
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProj