【今更だけどandroid.hardware.Cameraを使う】エラーを検知する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。

Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はエラーを検知する方法を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。

Camera#setErrorCallbackの使い方

final void setErrorCallback(Camera.ErrorCallback cb)はエラーが発生すると呼ばれるコールバックインターフェースを設定するメソッドです。
Camera.ErrorCallback#onError(int error, Camera camera)はエラーが発生した時に呼ばれるコールバックメソッドです。
第一引数はCameraで定義されたエラーコードが渡されます。
メディアサーバーが停止した時のコードです。Cameraインスタンスを解放し、再生成する必要があります。
CAMERA_ERROR_EVICTED優先度の高いユーザーがカメラデバイスを使うため、カメラデバイスへのアクセス権を失った時のコードです。
CAMERA_ERROR_SERVER_DIED
CAMERA_ERROR_UNKNOWN理由の分からない、定義されていない時のコードです。

    private Camera.ErrorCallback mErrorCallback = new Camera.ErrorCallback() {
        @Override
        public void onError(int error, Camera camera) {
            Log.d(TAG, "onError: " + error);
            if(mCamera != null) {
                mCamera.release();
                mCamera = null;
            }
            if(error == Camera.CAMERA_ERROR_EVICTED){
                Log.d(TAG, "onError: カメラデバイスの利用が不可になりました。" );
            } else if(error == Camera.CAMERA_ERROR_SERVER_DIED || error == Camera.CAMERA_ERROR_UNKNOWN) {
                startPreview();
            }
        }
    };
    
    private void setErrorCallback() {
        mCamera.setErrorCallback(mErrorCallback);
    }