ZXingでバーコードアプリ – 公開

Google Play Consoleからアプリを公開しました。製品版にリリースして、審査の状態からリリースの状態まで4時間ぐらいかかったでしょうか。

バーコードアプリは腐るほど世の中に出ているので、検索の上位に食い込むのはかなり難しそうです。

ということで、ここにリンクを貼っておきますので、興味があればダウンロードしてみてください。Android版のみになりますが、勉強のつもりで作ったので無料で広告もなしで、Android11に対応しています。よろしくお願いいたします。

Google Play で手に入れよう

バグなど、気づいたことがあれば、Google Playでコメントするか、ここに書いてもらえるとうれしいです。

【公開して思ったこと】

どのバーコードアプリも、似たり寄ったりなんですよね。その中で、マルチバーコードスキャンに対応しているアプリはかなり少ないことに気が付きました。

マルチバーコードスキャンとは、2つのバーコードを同時に読み込める機能です。そして、ZXingも機能として持っています。実は、実装前の調査でマルチバーコードスキャンのプログラムはテストしたことがあって、動作がどうしてももっさりしたので、仕様から外したんですよね。

でも、広告のチラシとか見ると、2つのQRコードを並べて掲載していることがとても多いのです。FacebookとLINEのコードを並べたりとか。そして、LINEのQRコードが欲しいのにFacebookを読み込んじゃったりするんです。そんなときは片方を指で隠してスキャンするんですが、指の影でうまく読み込めなかったりするんで、そんなときはマルチバーコードスキャンで2つとも読み込んじゃった方がいいのかもしれません。

実装はそんなに難しくないので、近日、着手してみようかと思います。

あと、Google Playの検索上位に入るにはどうしたらいいのか、少し、興味がわいてきました。どうするんでしょうか? これも調べてみます。

XamarinでAndroidアプリ公開(内部テスト)

VisualStudio2019のXamarin.Formsでのバーコードアプリ開発ですが、テスト版をGoogle Playにリリースしました。 つまづいたポイントをメモ。

(1)ReleaseモードにしてProGuardでコンパイルしたらエラー

「 ”java.exe” はコード 1 を伴って終了しました。」

というエラーです。直接の解決はできなかったのですが、下図の通りshrinkerを「ProGuard」から「r8」に変更したらエラーが出なくなりました。これに伴い、Dexコンパイラも「d8」に変更しています。なんだったんだろうか?

(2)文字コードのエラー

履歴データをCSVで吐き出す機能を付けたのですが、文字コードにShift-JISを使っていて、ReleaseモードでCSV出力するとエラーになりました。

デバッグモードのときは「共有ランタイムの使用」が有効になって問題は出なかったのですが、以下のように、「サポートされているその他のエンコーディング」で「CJK」を指定すればReleaseモードでもOKでした。

(3)Rsourceに指定した画像ファイルが画面に表示されない

全く原因が分からなかったのですが、Xamarin.Formsのバージョンを上げたら治りました。よく分からんです。

「4.8.0.1451 → 4.8.0.1534」

メイン画面のメニューボタンはにイメージボタンを使っていたので、起動したら真っ黒な画面しか表示されなかったときは少し焦りました。デバッグモードの時は問題なかったのですが・・・。

(4)2020年8月からAndroid9.0のアプリは新規公開できなくなった

Releaseモードで手持ちのスマホでは問題がなくなったところでGoogle Playへの公開作業です。

そして、、、Google Play Consoleでのアップロードの途中で「Android10以降で作ってね」とエラーになりました・・・。

知りませんでした。ターゲットフレームワークはAndroid9.0で作っていました。後戻りして最初からコンパイルしなおしです。

(5)Android10に上げたらコンパイルエラー

振り出しに戻ったら、一歩目でいきなりエラーです。まあ、しょうがないですね。ここはがまんのしどころです。

java関連のエラーがうじゃうじゃと10件以上。

開発環境のOSはWindows10。nugetパッケージの参照パスが漢字のユーザー名を含むパスになっていて、こいつが悪さをしていたようです。ユーザーをAdministratorに切り替え、参照パスに日本語文字を含まないようにしてからコンパイルするとうまくいきました。

日本語を含む参照パスが悪さをすることって時々あるけど、Android9.0のときはエラーにならなかったのは今でも不明。おかげで気づくまで半日ほどかかってしまった。

こんな感じで回り道しながらも、ようやく内部テスト版を公開できました。

今日はここまで。

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だけでなく、他のプロパティも疑った方がいいかもしれません。

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