ZXingでバーコードアプリ開発(4)

やっと、Xamarin.Formsのアプリとして詰め込みたい機能がそろってきたのでテストフェーズに入ってきたんですが、ここでZXingのバグに気づきました。

バーコードをスキャンする際、ZXing.Net.Mobileを使って ZXingScannerView のインスタンスをコードで生成して画面表示しています。

インスタンス生成のコードはこんな感じです。

//使っているZXing.Net.Mobile.Formsのバージョンは v3.0.0-Beta5

//スキャン可能なBarcodeフォーマットの一覧
List<ZXing.BarcodeFormat> barcodeFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,      //QR
    BarcodeFormat.CODABAR,      //NW-7 (JANCODEよりはBARが短くて済む)
    BarcodeFormat.CODE_128,     //CODE128, GS1-128
    BarcodeFormat.CODE_39,      //CODE39
    BarcodeFormat.CODE_93,      //CODE93
    BarcodeFormat.DATA_MATRIX,  //DataMatrix
    BarcodeFormat.EAN_8,        //JANCODE (8桁)
    BarcodeFormat.EAN_13        //JANCODE (13桁)                    
};

//インスタンス生成 
zxing = new ZXingScannerView()
{
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.FillAndExpand,
    AutomationId = "zxing",
    IsScanning = true,
    IsAnalyzing = true,
    Options = new ZXing.Mobile.MobileBarcodeScanningOptions
    {
        UseFrontCameraIfAvailable = false,  //フロントカメラの設定
        TryHarder = true,                   //厳しめに解析(速度が遅くなる)
        PossibleFormats = _barcodeFormats,  //バーコードフォーマット指定
        AssumeGS1 = true,                   //GS1の読み込みに必要
        UseNativeScanning = false,          //iOSのスキャナエンジンを使う場合に必要
        AutoRotate = true,                  //90度回転して解析するかどうか
        DisableAutofocus = true      //オートフォーカス
    }
};

ここで気づいたのですが、例えば後から CODE_39 をPorssibleFormats から外す処理を実行しても、残念なことに CODE_39 が読み込めてしまうんですね。PossibleFormatsを絞り込むとバーコードの読み取り速度が上がるので、重要な設定です。

でも、PossibleFormats をCODE_39を外した状態でインスタンスを再作成する方法だと、CODE_39は読めなくなり期待通りの動きをします。

どうやら、都度、インスタンスを作り直さないと設定変更が反映されないということみたいですね。 PossibleFormatsだけでなく、他のプロパティも疑った方がいいかもしれません。

なにかしらの読み込み設定の変更処理を行うときは、インスタンスを作成しなおすようにコード修正することにしました。