【今更だけどandroid.hardware.Cameraを使う】エラーを検知する
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_ERROR_EVICTED | 優先度の高いユーザーがカメラデバイスを使うため、カメラデバイスへのアクセス権を失った時のコードです。 |
| CAMERA_ERROR_SERVER_DIED | メディアサーバーが停止した時のコードです。Cameraインスタンスを解放し、再生成する必要があります。|
| 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);
}