为什么多个屏幕截图导致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;
}
}