Обновление от здесь . В отличие от предыдущего вопроса, я заменяю MediaRecorder на ImageReader, чтобы мое приложение делало снимок экрана с интервалом вместо короткого видео, поэтому я думаю, что новый вопрос будет более подходящим вариантом.
Ожидается, что приложение запускать в фоновом режиме бесконечно по мере запуска приложения. Предполагается, что фоновый процесс запускает обработчик (я использую badoo WeakHandler) с интервалом.
Однако после 200 итераций приложение будет остановлено без отображения cra sh в пользовательском интерфейсе телефона. Logcat приложения ничего не показывает, но я замечаю, что No Filters
logcat показывает
(печатная консоль, такая же, как на изображении выше)
2020-03-18 11:28:32.085 1974-3499/system_process I/DisplayManagerService: Display device removed: DisplayDeviceInfo{"MainActivity": uniqueId="virtual:com.screenomics,10086,MainActivity,0", 720 x 1280, modeId 684, defaultModeId 684, supportedModes [{id=684, width=720, height=1280, fps=60.0}], colorMode 0, supportedColorModes [0], HdrCapabilities null, density 560, 560.0 x 560.0 dpi, appVsyncOff 0, presDeadline 16666666, touch NONE, rotation 0, type VIRTUAL, state ON, owner com.screenomics (uid 10086), FLAG_PRIVATE, FLAG_PRESENTATION}
Пожалуйста Помогите! Спасибо
Я следовал некоторому руководству и в итоге получил ImageAvailableListener , похожий на многие другие демонстрационные программы, которые работают для меня.
private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
@Override
public void onImageAvailable(ImageReader reader) {
reader.setOnImageAvailableListener(null, null);
Image image = null;
FileOutputStream fos = null;
Bitmap bitmap = null;
Date date = new Date();
screenshot = getApplicationContext().getExternalFilesDir(null).getAbsolutePath() + "/screenomics_" + sdf.format(date) + ".png";
try {
image = reader.acquireLatestImage();
if (image != null) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * DISPLAY_WIDTH;
bitmap = Bitmap.createBitmap(DISPLAY_WIDTH + rowPadding / pixelStride, DISPLAY_HEIGHT, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
fos = new FileOutputStream(screenshot);
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
bitmap.recycle();
image.close();
}
}
}
}
}
интервальная программа работает на Badoo WeakHandler, и это выглядело так:
public void startCapturing() {
try {
mHandler.post(captureInterval);
Toast.makeText(this, "started", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
private Runnable captureInterval = new Runnable() {
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
destroyImageReader();
destroyVirtualDisplay();
if (!mKeyguardManager.isKeyguardLocked()) {
if (mMediaProjection == null) {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
return;
}
createVirtualDisplay();
}
mHandler.postDelayed(this, 5000);
}
};
createVirtualDisplay
private void createVirtualDisplay() {
mVirtualDisplay = mMediaProjection.createVirtualDisplay(TAG, DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);
}