ресурсы релиза Android Camera2 не работает правильно - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу создать собственное приложение камеры в Android. У меня есть одно действие, которое использует два фрагмента. Один фрагмент для камеры, а другой для показа фотографии или видео, которые были сделаны. Когда начинается активность, загружается фрагмент камеры. В предварительном просмотре камеры есть кнопка, которая используется для записи видео. При длительном нажатии на кнопку начинается запись, а по окончании длительного нажатия запись видео останавливается и файл отправляется на фрагмент, который показывает видео. Другими словами, в конце долгого нажатия на кнопку я заменяю фрагмент камеры новым фрагментом, который показывает результат. Во время паузы фрагмента камеры я остановил устройство камеры, но после перерыва между фрагментами я не могу использовать камеру вообще. После некоторой перемотки вперед и назад ни одно приложение камеры не работает в моем телефоне, и мне приходится перезагружать телефон.

вот некоторые коды моего фрагмента камеры

@OnLongClick(R.id.capture)
public boolean captureLongPressed() {
    startRecord();
    mMediaRecorder.start();
    return true;
}

@OnTouch(R.id.capture)
public boolean captureOnTouch(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        if (isRecordButtonLongPressed) {
            mIsRecording = false;
            try {
                mMediaRecorder.stop();
                mMediaRecorder.reset();
            } catch (RuntimeException ex) {
            }
            if (listener != null)
                listener.onVideoRecorded(mVideoFileName);
            return true;
        }
    }
    return false;
}

private void startRecord() {
    try {
        setupMediaRecorder();
        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);
        Surface recordSurface = mMediaRecorder.getSurface();
        mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
        mCaptureRequestBuilder.addTarget(previewSurface);
        mCaptureRequestBuilder.addTarget(recordSurface);
        mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface), new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                try {
                    session.setRepeatingRequest(mCaptureRequestBuilder.build(), null, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession session) {

            }
        }, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void setupMediaRecorder() throws IOException {
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setOutputFile(mVideoFileName);
    mMediaRecorder.setVideoEncodingBitRate(1000000);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setOrientationHint(mTotalRotation);
    mMediaRecorder.prepare();
 }
@Override
public void onPause() {
    closeCamera();
    stopBackgroundThread();
    super.onPause();
}

private void closeCamera() {
    if (null != mCameraDevice) {
        mCameraDevice.close();
        mCameraDevice = null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...