📌  相关文章
📜  如何在Android中以编程方式获取屏幕截图?(1)

📅  最后修改于: 2023-12-03 15:08:51.204000             🧑  作者: Mango

如何在Android中以编程方式获取屏幕截图

在开发Android应用程序的过程中,有时需要获取屏幕截图。本文将介绍如何在Android中以编程方式获取屏幕截图。

方法一:使用MediaProjectionManager

Android提供了MediaProjectionManager API,可以用于截取屏幕上的内容。下面是具体步骤:

  1. 获取MediaProjection实例

    MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
    Intent intent = projectionManager.createScreenCaptureIntent();
    startActivityForResult(intent, REQUEST_CODE);
    

    在Activity的onActivityResult()方法中获取MediaProjection实例:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                MediaProjection mediaProjection = projectionManager.getMediaProjection(resultCode, data);
            }
        }
    }
    
  2. 创建VirtualDisplay

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    int densityDpi = metrics.densityDpi;
    int screenWidth = metrics.widthPixels;
    int screenHeight = metrics.heightPixels;
    int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
    MediaProjection mediaProjection = null; // 获取到的MediaProjection实例
    ImageReader imageReader = ImageReader.newInstance(screenWidth, screenHeight, PixelFormat.RGBA_8888, 2);
    VirtualDisplay virtualDisplay = mediaProjection.createVirtualDisplay("ScreenShooter", screenWidth, screenHeight, densityDpi, flags, imageReader.getSurface(), null, null);
    
  3. 获取屏幕截图

    Image image = imageReader.acquireLatestImage();
    Bitmap bitmap = imageToBitmap(image);
    image.close();
    

    注意:获取到的bitmap是屏幕的内容,但是它不包含状态栏和导航栏的内容。

方法二:使用SurfaceControl.screenshot方法

这是一种Android 7.0及以上版本可用的方法,具体步骤如下:

  1. 获取屏幕的宽高

    DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
    Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
    Point size = new Point();
    display.getRealSize(size);
    int width = size.x;
    int height = size.y;
    
  2. 调用SurfaceControl.screenshot方法获取屏幕截图

    Rect sourceCrop = new Rect(0, 0, width, height);
    Bitmap bitmap = SurfaceControl.screenshot(sourceCrop, width, height, 0);
    

    这种方法获取到的bitmap包含状态栏和导航栏。

总结

本文介绍了两种在Android中以编程方式获取屏幕截图的方法。第一种方法使用MediaProjectionManager API,可适用于Android 5.0及以上版本;第二种方法使用SurfaceControl.screenshot方法,适用于Android 7.0及以上版本。开发者可根据自己的需求选择合适的方法。