Сбой приложения при использовании MediaProjection и ImageReader для создания снимка экрана на Android после 200 итераций - PullRequest
0 голосов
/ 18 марта 2020

Обновление от здесь . В отличие от предыдущего вопроса, я заменяю MediaRecorder на ImageReader, чтобы мое приложение делало снимок экрана с интервалом вместо короткого видео, поэтому я думаю, что новый вопрос будет более подходящим вариантом.
Ожидается, что приложение запускать в фоновом режиме бесконечно по мере запуска приложения. Предполагается, что фоновый процесс запускает обработчик (я использую badoo WeakHandler) с интервалом.

Однако после 200 итераций приложение будет остановлено без отображения cra sh в пользовательском интерфейсе телефона. Logcat приложения ничего не показывает, но я замечаю, что No Filters logcat показывает enter image description here (печатная консоль, такая же, как на изображении выше)

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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...