1.獲取手機屏幕寬高,密度。
mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
Display display = getWindowManager().getDefaultDisplay();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getRealMetrics(displayMetrics);
mWidth = displayMetrics.widthPixels;
mHeight = displayMetrics.heightPixels;
display.getMetrics(displayMetrics);
mScreenDensity = (int) displayMetrics.density;
2.創建截圖意圖
/**
* 創建截圖意圖
*/
@SuppressLint("WrongConstant")
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private Intent createScreenCaptureIntent() {
//這裏用media_projection代替Context.MEDIA_PROJECTION_SERVICE 是防止低於21 api編譯不過
MediaProjectionManager media_projection = (MediaProjectionManager) getSystemService("media_projection");
return media_projection.createScreenCaptureIntent();
}
3.申請截圖權限
/**
* 申請截圖權限
*/
public void requestScreenShot() {
if (Build.VERSION.SDK_INT >= 21) {
startActivityForResult(createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
Log.d("TransparentActivity", "申請權限");
} else {
AccessibilityLog.printLog("版本過低,無法截屏");
}
}
4.操作返回結果
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//同意截屏後開始初始化截屏工具
switch (requestCode) {
case REQUEST_MEDIA_PROJECTION:
if (resultCode == RESULT_OK) {
mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
mVirtualDisplay = mediaProjection.createVirtualDisplay("mediaprojection", mWidth, mHeight,
mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
break;
}
}
}
5.生成截圖Bitmap
Image image = mImageReader.acquireLatestImage();
if (image != null) {
final Image.Plane[] planes = image.getPlanes();
if (planes.length > 0) {
final ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
Bitmap bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
image.close();
}