やりたいこと
- AndroidアプリでZXingを使ってQRコードを連続で読み取りたい。
- バックカメラではなくフロントカメラで読み取りたい。
- 読み取ったあとは、確認ダイアログを出したい。
- ダイアログが閉じたときにQRコードの読み取りを再開したい。
困ったこと
- フロントカメラを使って読み取る方法がネットの海から見つからない。
- decodeContinuousを使って連続読み取りをすると、ダイアログを出してる最中もガンガン読み取ってログが大変なことに。
解決策
- (CompoundBarcodeView).getBarcodeView().getCameraSettings().setRequestedCameraId(1)でフロントカメラに設定できた。
- シングル読み取りするメソッドを作成して、ダイアログの処理後にもう一回そのメソッドを呼ぶようにした。
以下、実装
環境
Windows10
AndroidStudio3.6.3
build.garage
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.journeyapps:zxing-android-embedded:3.0.2@aar'
implementation 'com.google.zxing:core:3.2.0'
}
カメラの権限を追加
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
xmlの記述
main.xml
<com.journeyapps.barcodescanner.CompoundBarcodeView
android:id="@+id/barcodeView"
(省略)/>
Activityの実装(抜粋)
MainActivity.java
private CompoundBarcodeView mBarcodeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
mBarcodeView = (CompoundBarcodeView) findViewById(R.id.barcodeView);
CameraSettings settings = mBarcodeView.getBarcodeView().getCameraSettings();
settings.setRequestedCameraId(1); // フロントカメラを使用したかったので設定。デフォルトはバックカメラ(0)
mBarcodeView.getBarcodeView().setCameraSettings(settings);
mBarcodeView.resume();
barcodeViewSingle();
}
private void barcodeViewSingle() { //読み取り処理を行うメソッド
mBarcodeView.decodeSingle(new BarcodeCallback() { //読み取りを行う
@Override
public void barcodeResult(BarcodeResult result) {
okDialog(result.getText()); //result.getText()で読み取り結果を取得し、ダイアログのメソッドへ
}
@Override
public void possibleResultPoints(List resultPoints) {
}
});
}
private void okDialog(String str) {
final String mStr = str;
new AlertDialog.Builder(this)
.setMessage(mStr + "でOK?")
.setPositiveButton("OK!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 何かしらの処理
barcodeViewSingle(); //もう一回呼び出すことで擬似的に連続読み取り
}
})
.setNegativeButton("NON!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 何かしらの処理
barcodeViewSingle(); //もう一回呼び出s(ry
}
})
.setCancelable(false)
.show();
}
おわりに
ちなみにバーコード読み取りライブラリの「ZXing」は「ゼブラクロッシング」と読むみたいです。
直訳すると「横断歩道」。ネーミングセンスありますね。
- 当ページの人物画像はNIGAOE MAKERで作成しました。