Android 5.0以上(MediaProjectionManager)截屏

 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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章