android - 为什么多个屏幕截图导致系统在android上崩溃?
问题描述
我需要长时间保持截图。但它会使系统崩溃。这是我的MainActivity
大约 220 次,系统就会崩溃。
我猜这可能是由内存泄漏引起的,但我找不到它。
手机:一加7 Pro
操作系统:氧气操作系统(Android 9)
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 1050;
private String TAG = "Service";
private MainApplication mainApplication;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainApplication = (MainApplication) getApplication();
if (MainApplication.sceenWidth == 0 || MainApplication.sceenHeight == 0) {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
MainApplication.sceenHeight = Math.min(dm.heightPixels, dm.widthPixels);
MainApplication.sceenWidth = Math.max(dm.heightPixels, dm.widthPixels);
MainApplication.dpi = dm.densityDpi;
}
// mainApplication.init(this);
ScreenCaptureUtilByMediaPro.mProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
// init
startActivityForResult(ScreenCaptureUtilByMediaPro.mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (RESULT_OK == resultCode && REQUEST_CODE == requestCode) {
ScreenCaptureUtilByMediaPro.data = data;
ScreenCaptureUtilByMediaPro.resultCode = resultCode;
ScreenCaptureUtilByMediaPro.init();
int i = 0;
while (true) {
Bitmap screenCap = ScreenCaptureUtilByMediaPro.getScreenCap();
System.out.println(screenCap);
System.out.println(i);
i++;
sleep(2000);
}
}
}
}
和其他类:
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;
}
}
解决方案
推荐阅读
- mysql - 用 mysql 分页 Nodejs 表达
- c# - C# .net Core 异常 - 子类中的更改消息
- android - react-native-device-info 在 android 上使应用程序崩溃
- dart - Flutter - 在 null 上调用了方法“map”
- google-apps - “与 Google 集成”按钮突然消失(接收 404)
- kotlin - 在 kotlin 中使用带有 rxjava 的密封类时出现类型不匹配
- excel - 使用activex控件从左到右滚动excel窗口
- jquery-select2 - 如何在select2删除按钮上添加条件
- configure - 配置:错误:未找到 gdal-includes
- gnuplot - 带有前导零的 gnuplot for 循环