【今更だけどandroid.hardware.Cameraを使う】オートフォーカス機能を追加する
android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。
Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はオートフォーカス機能を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。
オートフォーカスするには二つの方法があります。
- Camera#autoFocus(Camera.AutoFocusCallback cb)を使用して、単発のオートフォーカス機能を実行します。
- Camera.Parameters#setFocusMode(String value)を使用してカメラのフォーカスモードをFOCUS_MODE_CONTINUOUS_PICTUREやFOCUS_MODE_CONTINUOUS_VIDEOに変更します。
Camera#autoFocus(Camera.AutoFocusCallback cb)の使い方
final void autoFocus(Camera.AutoFocusCallback cb)はオートフォーカス機能を実行するためのメソッドです。Camera#autoFocusのCamera.AutoFocusCallback cbはオートフォーカス機能のコールバックインターフェースを設定することができます。
Camera.AutoFocusCallback#onAutoFocus(boolean success, Camera camera)はオートフォーカスが完了したタイミングで呼ばれるメソッドです。
boolean successはオートフォーカス機能の成否を表します、フォーカスに成功した場合はtrue、失敗した場合はfalseが渡されます。
private Camera.AutoFocusCallback mAutoFocusCallback = new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { Log.d(TAG, "onAutoFocus: " + success); } }; public void startAutoFocus() { mCamera.autoFocus(mAutoFocusCallback); }
Camera.Parameters#setFocusMode(String value)の使い方
Camera.Parameters#setFocusMode(String value)は以前説明しました。Camera.Parameters#setFocusModeを使いフォーカスモードをFOCUS_MODE_CONTINUOUS_PICTUREやFOCUS_MODE_CONTINUOUS_VIDEOにすると連続してフォーカス機能が実行されます。
Camera#setAutoFocusMoveCallback(Camera.AutoFocusMoveCallback cb)は、フォーカスが移動した時のコールバックインターフェースを設定することができます。
Camera.AutoFocusMoveCallback#onAutoFocusMoving(boolean start, Camera camera)はフォーカスの移動開始と移動終了のタイミングで呼ばれるメソッドです。
boolean startはフォーカスの移動開始時はtrue、移動終了時はfalseが渡されます。
private Camera.AutoFocusMoveCallback mAutoFocusMoveCallback = new Camera.AutoFocusMoveCallback() { @Override public void onAutoFocusMoving(boolean start, Camera camera) { Log.d(TAG, "onAutoFocusMoving: " + start); } }; public void startContinuousAutoFocus() { Camera.Parameters parameters = mCamera.getParameters(); if(parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); mCamera.setParameters(parameters); mCamera.setAutoFocusMoveCallback(mAutoFocusMoveCallback); } }
Camera#cancelAutoFocus()の使い方
Camera#cancelAutoFocusは進行中のオートフォーカス機能をキャンセルするメソッドです。キャンセルされた後はフォーカス位置をデフォルトの位置に戻します。
public void cancelAutoFocus(){ mCamera.cancelAutoFocus(); }