Android Lで非推奨になってしまったCamera APIは使いたくない。かといってCamera2 APIはめんどくさい。
やりたいことはカメラのプレビューを表示するだけなのに、何か良い方法はないかと考えていた時にGoogle Play ServiceのMobile Vision APIでカメラ映像のプレビューができることを発見しました。
しかしMobile Vision APIのドキュメントには顔検出やバーコードリーダーとして使う方法しか書いておらず(当たり前)、カメラ映像のプレビュー表示だけを行うことはできないのかなぁと思って試行錯誤してみたところ上手く行ったので、その方法をまとめます。
まず、以下の二つのクラスを作成します。
import android.util.SparseArray;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.Frame;
public class DummyDetector extends Detector<Void> {
@Override
public SparseArray<Void> detect(Frame frame) {
return null;
}
}
import com.google.android.gms.vision.Detector;
public class DummyProcessor implements Detector.Processor<Void> {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Void> detections) {
}
}
Mobile Vision APIはカメラの映像から何かのオブジェクトを検出してアプリケーションに受け渡すためのフレームワークなのですが、「何も処理をしない」ということが考慮されていません。
なので、「何も検出しない」「何も処理しない」というダミーのDetector
とProcessor
の実装を作成して、これを利用します。
あとは、これを使ってCameraSource
を作成して、CameraSource.start()
を呼び出せばプレビューが開始します。プレビュー画像サイズやフレームレート等は必要に応じて設定してください。
DummyDetector dummyDetector = new DummyDetector();
dummyDetector.setProcessor(new DummyProcessor());
cameraSource = new CameraSource.Builder(getContext(), dummyDetector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedFps(30.0f)
.setAutoFocusEnabled(true)
.build();
cameraSource.start(surfaceHolder);
surfaceHolder
は、SurfaceView
などから取得します。