woshidan's loose leaf

ぼんやり勉強しています

CameraDevice closeのタイミングとCameraCaptureSession closeのタイミングについて

https://github.com/googlesamples/android-Camera2Basic のサンプルから確認してメモする。

まとめ

  • CameraDeviceCameraDevice.StateCallback のコールバックの中でcloseする
    • onDisconnectedonError の中でclose
    • セマフォのロックを解放しながら処理をしていた。このセマフォのロックは CameraDevice をオープンする時に獲得しようとされている
      • セマフォはカメラを解放する前にアプリの処理が終了するのを防ぐため
        • onPauseで処理をする場合など、onPause -> 次の処理へ行かないようにする働きがある… のか?
        • カメラを解放する前後の処理は一つのスレッドしか処理を進めないようにしている?
  • CameraCaptureSessiononPauseclose していた

コード

https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L184-L215

    /**
     * {@link CameraDevice.StateCallback} is called when {@link CameraDevice} changes its state.
     */
    private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {

        @Override
        public void onOpened(@NonNull CameraDevice cameraDevice) {
            // This method is called when the camera is opened.  We start camera preview here.
            mCameraOpenCloseLock.release();
            mCameraDevice = cameraDevice;
            createCameraPreviewSession();
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
            mCameraOpenCloseLock.release();
            cameraDevice.close();
            mCameraDevice = null;
        }

        @Override
        public void onError(@NonNull CameraDevice cameraDevice, int error) {
            mCameraOpenCloseLock.release();
            cameraDevice.close();
            mCameraDevice = null;
            Activity activity = getActivity();
            if (null != activity) {
                activity.finish();
            }
        }

    };

https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L456-L461

    @Override
    public void onPause() {
        closeCamera();
        stopBackgroundThread();
        super.onPause();
    }

https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L624-L647

    /**
     * Closes the current {@link CameraDevice}.
     */
    private void closeCamera() {
        try {
            mCameraOpenCloseLock.acquire();
            if (null != mCaptureSession) {
                mCaptureSession.close();
                mCaptureSession = null;
            }
            if (null != mCameraDevice) {
                mCameraDevice.close();
                mCameraDevice = null;
            }
            if (null != mImageReader) {
                mImageReader.close();
                mImageReader = null;
            }
        } catch (InterruptedException e) {
            throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
        } finally {
            mCameraOpenCloseLock.release();
        }
    }

気になってることについては

  • [既存気になること]デバイスの向きとアプリの向きの差分
  • [新しい気になること]Javaセマフォの使い方のイメージがない(並行処理Java読む?)

とりあえずウェブオペレーションが2周目読んでからじゃないと次行っちゃダメっぽい感じで並行処理は来月かなー。