1.直接上代码,截取屏幕工具类:ScreenShotHelper
import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.ImageFormat; 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.MediaProjectionManager; import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.util.DisplayMetrics; import android.util.Log; import android.widget.Toast; import com.dtt.app.custom.utils.Constants; import com.dtt.app.custom.utils.LogUtils; import com.mapscloud.common.utils.ScreenUtils; import java.nio.ByteBuffer; public class ScreenShotHelper { private static final String TAG = ScreenShotHelper.class.getSimpleName(); private static ScreenShotHelper mInstance; private MediaProjectionManager mMediaProjectionManager; private int mScreenDensity; private MediaProjection mMediaProjection; private VirtualDisplay mVirtualDisplay; private int mResultCode; private Intent mResultData; private int mWindowWidth, mWindowHeight; public static final int REQUEST_MEDIA_PROJECTION = 0x79; private ImageReader mImageReader; private Handler backgroundHandler; private ScreenShotHelper() { } public static ScreenShotHelper getInstance() { if (mInstance == null) { mInstance = new ScreenShotHelper(); } return mInstance; } /** * 截屏调用方法 * @param activity * @param callback 回调截取到的bitmap */ public void screenShot(Activity activity,ScreenShotCallback callback) { // 系统截屏方法 if (Build.VERSION.SDK_INT >= 21) { initScreenShotParam(activity); startScreenCapture(activity,callback); } else { Toast.makeText(activity, "版本过低,无法截屏", Toast.LENGTH_SHORT).show(); Log.e("TAG", "版本过低,无法截屏"); } } /** * 初始化截屏使用的参数 * @param activity */ private void initScreenShotParam(Activity activity){ DisplayMetrics metrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); mScreenDensity = metrics.densityDpi; mWindowWidth = ScreenUtils.getScreenWidth(activity); mWindowHeight = ScreenUtils.getScreenHeight(activity); mMediaProjectionManager = (MediaProjectionManager) activity.getSystemService(Context.MEDIA_PROJECTION_SERVICE); } /** * 开始截取屏幕 * @param activity */ private void startScreenCapture(Activity activity,ScreenShotCallback callback) { stopScreenCapture(); if (activity == null) { return; } activity.startActivityForResult( mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION); } /** * 设置VirtualDisplay */ private void setUpVirtualDisplay() { mImageReader = ImageReader.newInstance(mWindowWidth, mWindowHeight, 0x1, 2);//此处format 必须用0x1否则会报 格式不符(用了ImageFormat.RGB_565报错,必须用0x1) mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror", mWindowWidth, mWindowHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); } /** * 设置MediaProjection */ private void setUpMediaProjection() { mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData); } /** * 释放VirtualDisplay */ private void stopScreenCapture() { if (mVirtualDisplay == null) { return; } mVirtualDisplay.release(); mVirtualDisplay = null; } /** * 关闭MediaProjection */ private void tearDownMediaProjection() { if (mMediaProjection != null) { mMediaProjection.stop(); mMediaProjection = null; } } /** * activityResult方法中需要操作的代码 * @param requestCode * @param resultCode * @param data * @param activity * @param callback */ public void onActivityResult(int requestCode,int resultCode,Intent data,Activity activity,ScreenShotCallback callback){ if (requestCode == REQUEST_MEDIA_PROJECTION) { if (resultCode != Activity.RESULT_OK) { Toast.makeText(activity,"用户取消", Toast.LENGTH_SHORT).show(); return; } if (activity == null) { return; } mResultCode = resultCode; mResultData = data; setUpMediaProjection(); setUpVirtualDisplay(); mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader imageReader) { Image image = null; try { image = imageReader.acquireLatestImage(); 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); //去除状态栏和导航栏的截图 int statusBarHeight = ScreenUtils.getStatusBarHeight(activity); int navigationBarHeight = ScreenUtils.getNavigationBarHeight(activity); bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight,width, height-statusBarHeight-navigationBarHeight); //带状态栏和导航栏的截图 // bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height); callback.ScreenShotBitmap(bitmap); }catch (Exception e){ e.printStackTrace(); LogUtils.e(LogUtils.FROM_XQ, Constants.STRINGTAG + TAG + "_onActivityResult",e.getMessage()); }finally { if (image != null) { image.close(); } if (mImageReader != null) { mImageReader.close(); } stopScreenCapture(); tearDownMediaProjection(); mImageReader.setOnImageAvailableListener(null, null); } } },getBackgroundHandler()); } } public interface ScreenShotCallback{ void ScreenShotBitmap(Bitmap bitmap); } /** * 设置一个子线程 创建操作图片 * @return */ private Handler getBackgroundHandler() { if (backgroundHandler == null) { HandlerThread backgroundThread = new HandlerThread("catwindow", android.os.Process .THREAD_PRIORITY_BACKGROUND); backgroundThread.start(); backgroundHandler = new Handler(backgroundThread.getLooper()); } return backgroundHandler; } }
2.用法:
-
截取屏幕按钮onclick中:
ScreenShotHelper.getInstance().screenShot((Activity)mContext,screenShotCallback);
- onActivityResult方法
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//屏幕截屏
ScreenShotHelper.getInstance()
.onActivityResult(requestCode,resultCode,data,(Activity) mContext,screenShotCallback);
}
- 创建回调方法
public ScreenShotHelper.ScreenShotCallback screenShotCallback = new ScreenShotHelper.ScreenShotCallback() {
@Override
public void ScreenShotBitmap(Bitmap bitmap) {
//此方法是子线程
((Activity)mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
flOvThemeMap.setVisibility(VISIBLE);
}
});
//弹出分享弹窗 传入标题 和 bitmap图片数据
new ThemeMapShareDialog(mContext,bitmap,title)
.showAtLocation(flOvThemeMap, Gravity.CENTER,0,0);
}
};