为什么多个屏幕截图导致android系统崩溃?

为什么多个屏幕截图导致android系统崩溃?,android,Android,我需要在很长一段时间内不断获取屏幕截图。但这会导致系统崩溃。 这是我的main活动 大约220次,系统将崩溃 我想可能是内存泄漏造成的,但我找不到 电话:oneplus 7 pro 操作系统:氧气操作系统(安卓9) 和其他类别: public class ScreenCaptureUtilByMediaPro { public static MediaProjectionManager mProjectionManager; public static Intent data;

我需要在很长一段时间内不断获取屏幕截图。但这会导致系统崩溃。 这是我的
main活动

大约220次,系统将崩溃

我想可能是内存泄漏造成的,但我找不到

电话:oneplus 7 pro

操作系统:氧气操作系统(安卓9)

和其他类别:


public class ScreenCaptureUtilByMediaPro {
    public static MediaProjectionManager mProjectionManager;
    public static Intent data;
    public static int resultCode;
    private static MediaProjection sMediaProjection;
    private static ImageReader mImageReader;
    private static VirtualDisplay mVirtualDisplay;

    private static Bitmap bitmapCache;

    public static void init() {
        sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
        //start capture reader
        mImageReader = ImageReader.newInstance(MainApplication.sceenWidth, MainApplication.sceenHeight,
                PixelFormat.RGBA_8888, 2);
        mVirtualDisplay = sMediaProjection.createVirtualDisplay(
                "ScreenShot",
                MainApplication.sceenWidth,
                MainApplication.sceenHeight,
                MainApplication.dpi,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
                mImageReader.getSurface(),
                null,
                null);
    }


    /**
     * 
     *
     * @return
     */
    @Deprecated
    public static Bitmap getScreenCap() {

        Bitmap bitmap;
        android.media.Image image;
        do {
            image = mImageReader.acquireLatestImage();
            if (image == null && bitmapCache != null) {
                return bitmapCache;
            }
        } while (image == null);
        bitmap = covetBitmap(image);
        if (bitmapCache != null) {
            bitmapCache.recycle();
            bitmapCache = null;
        }
        bitmapCache = bitmap;
        return bitmap;
    }


    public static Bitmap covetBitmap(android.media.Image image) {
        int width = image.getWidth();
        int height = image.getHeight();
        final android.media.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);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
        image.close();
        return bitmap;
    }


}



请在日志中显示错误。@JonGoodwin没有任何错误!你对这个问题的标题是“为什么多个屏幕截图导致系统在android上崩溃?”你还说“大约220次,系统会崩溃。”*你没有发现错误吗?然后您需要调试它,或者使用内存泄漏工具。请重试

public class ScreenCaptureUtilByMediaPro {
    public static MediaProjectionManager mProjectionManager;
    public static Intent data;
    public static int resultCode;
    private static MediaProjection sMediaProjection;
    private static ImageReader mImageReader;
    private static VirtualDisplay mVirtualDisplay;

    private static Bitmap bitmapCache;

    public static void init() {
        sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
        //start capture reader
        mImageReader = ImageReader.newInstance(MainApplication.sceenWidth, MainApplication.sceenHeight,
                PixelFormat.RGBA_8888, 2);
        mVirtualDisplay = sMediaProjection.createVirtualDisplay(
                "ScreenShot",
                MainApplication.sceenWidth,
                MainApplication.sceenHeight,
                MainApplication.dpi,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
                mImageReader.getSurface(),
                null,
                null);
    }


    /**
     * 
     *
     * @return
     */
    @Deprecated
    public static Bitmap getScreenCap() {

        Bitmap bitmap;
        android.media.Image image;
        do {
            image = mImageReader.acquireLatestImage();
            if (image == null && bitmapCache != null) {
                return bitmapCache;
            }
        } while (image == null);
        bitmap = covetBitmap(image);
        if (bitmapCache != null) {
            bitmapCache.recycle();
            bitmapCache = null;
        }
        bitmapCache = bitmap;
        return bitmap;
    }


    public static Bitmap covetBitmap(android.media.Image image) {
        int width = image.getWidth();
        int height = image.getHeight();
        final android.media.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);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
        image.close();
        return bitmap;
    }


}