バーコード読み取り機能を使う

バーコード読み取り機能とは

stera terminal mobileでは端末背面に搭載されたカメラおよび赤色LEDによりバーコードの読み取りおよびターゲット位置への赤光の照射ができます。

本機能はstera terminal standardおよび、steara temina unitでは未対応です。

バーコード読み取り機能 イメージ

3rdアプリベンダーは本機能を利用して以下の二つの機能を実装できます。

1.バーコード読取り機能

2.エイマー(赤色LED)の単独ON/OFF機能

バーコード読み取り機能を利用することでPOSアプリケーションのようなバーコードを活用したアプリを開発いただけます。

また、エイマーを単独で利用することで3rdアプリベンダーが任意のバーコードデコーダーを利用することもできます。

アプリはBarcodeReaderSDKを組み込むことでバーコード読取り機能を利用することができます。

BarcodeReaderSDKの取り込み方法はSDK仕様書を参照ください。

ダウンロードページ

BarcodeReaderSDK概要

本APIを利用して開発されたJavaアプリは、下記のいずれかの使用用途を選択する必要があります。同時に利用することはできません。

1.BarcodeReader:カメラとバーコードデコードライブラリを使用した、バーコード読み取り機能

パナソニックが提供するバーコードデコーダー、カメラ制御(リアカメラのみ)、エイマーフラッシュ制御を使用してバーコードを読み取る機能BarcodeReaderが提供する機能は次のとおりです。

  • バーコード読取り
    対応するバーコード種別はQR Code/CODE128/GS-128/Codabar(NW7)/CODE39/EAN-8/EAN-13/UPC-A/UPC-Eです。デコード結果として文字列(UTF-8)もしくは、バイナリ列がアプリ側で取得できます。
  • プレビュー表示機能
    スキャン中、リアカメラが取得しているプレビュー画像を表示できます。

2.AimerController:エイマーの単独制御機能

バーコードデコーダーやカメラ制御を3rdアプリベンダで用意し、エイマーの点灯、消灯制御のみをする機能

BarcodeReaderSDKのライフサイクル

BarcodeReaderSDKはライフサイクルを監視することで、各機能を動作させるために必要な処理を、自動的に適切なタイミングで行います。

そのため、Javaアプリ側では、onStart () と onStop() などで明示的に使用開始および停止を指示するのではなく、BarcodeReaderクラス、または AimerController クラスが持つ bindToLifecycle() メソッドを実行して、各機能に関連付けるライフサイクルを指定してください。

BarcodeReaderSDKはライフサイクルを監視し、その状態遷移に合わせて各機能を利用するために必要なリソースの初期化および解放処理を自動的に行います。

他のSDKとアプリ側でSDKの開始、終了処理が異なるため実装にご注意ください。

BarcodeReaderSDKのライフサイクル イメージ

BarcodeReader APIについて

InstalledInformation Java API メソッド

No 項目 概要 メソッド 引数 設定値 デフォルト
1 ライフサイクルとの関連付け このメソッド実行以後、ライフサイクルに合わせて自動的に適切なタイミングで初期化処理が行われます。 bindToLifecycle Context LifecycleOwner
2 バーコード読み取り機能 カメラを利用したバーコード読み取りを行います。読み取った結果(バーコード種別、文字列、バイト列)を取得できます。
スキャン開始後10秒以内にバーコードを読み取れなかった場合はタイムアウトします。
呼び出し側からスキャンをキャンセルすることもできます。
scan なし
3 ライフサイクルとの関連付けの破棄 現在のライフサイクルとの関連付けを切り、BarcodeReader インスタンスの利用を終了します。
対象バーコード種別などを変更して再度スキャンを開始したい場合になどにLifecycleとの連携を切り、BarcodeReaderの使用を終了するために使用してください。
unbind()を実行中にスキャン中だった場合、そのスキャンはキャンセルされます。
unbind なし

BarcodeReader.Builder API一覧

No 項目 概要 メソッド 引数 設定値 デフォルト
1 読み取り対象バーコード種別指定機能 読み取りに対応するバーコード種別を指定する機能です。 setBarcodeFormats 下記の値を複数指定可能(可変引数)
BarcodeReader.FORMAT_QR_CODE
BarcodeReader.FORMAT_CODE_128
BarcodeReader.FORMAT_GS1_128
BarcodeReader.FORMAT_CODABAR
BarcodeReader.FORMAT_CODE_39
BarcodeReader.FORMAT_EAN_JAN_8
BarcodeReader.FORMAT_EAN_JAN_13
BarcodeReader.FORMAT_UPC_A
BarcodeReader.FORMAT_UPC_E
QR Code
CODE128
GS1-128
Codabar (NW7)
CODE39
EAN-8
EAN-13
UPC-A
UPC-E
対象バーコード種別なし
2 フラッシュライト強さ指定機能 端末背面に搭載されているフラッシュライトの強さを指定する機能です。数字が高いほど、光り方が強くなります。 setFlashLight BarcodeReader.FLASH_OFF
BarcodeReader.FLASH_LEVEL1
BarcodeReader.FLASH_LEVEL2
BarcodeReader.FLASH_LEVEL3
オフ
Level1
Level2
Level3
Level1
3 エイマー点滅機能 端末背面に搭載されているエイマーが点滅する機能です。 setAimer BarcodeReader.AIMER_OFF
BarcodeReader.AIMER_ON
オフ
オン
オン
4 プレビュー表示機能 BarcodeReaderSDK に対して、BarcodeReaderPreviewView を渡すことで、そこにカメラ画像が描画される機能です。 setPreview オフの時はsetPreview を記載しない
オンの時はsetPreview() の引数として、BarcodeReaderPreviewView のインスタンスを指定
オフ
オン
オフ
5 読み取り音鳴動機能 読み取り完了時に鳴動する機能です。 setAudioFeedback BarcodeReader.AUDIO_FEEDBACK_OFF
BarcodeReader.AUDIO_FEEDBACK_DEFAULT
オフ
オン
オン
6 カメラ解像度指定機能 バーコード読み取りに使用するカメラの解像度を指定する機能です。
遠く(読み取り対象まで20cm以上)を読み取りたいときは1M/2M、近く(読み取り対象まで20cm以内)を読み取りたいときは1.5MWide を使用してください。
setResolution BarcodeReader.RESOLUTION_1M
BarcodeReader.RESOLUTION_2M
BarcodeReader.RESOLUTION_1_5M_WIDE
1M
2M
1.5M Wide
1.5M Wide
7 信頼性レベル指定機能 バーコードの読み取り結果に対する信頼性レベルを指定する機能です。
信頼性レベルは数字が高いほど誤読が減りますが、読み取り速度が遅くなります。
setConfidenceLevel BarcodeReader.CONFIDENCE_LEVEL0
BarcodeReader.CONFIDENCE_LEVEL1
BarcodeReader.CONFIDENCE_LEVEL2
BarcodeReader.CONFIDENCE_LEVEL3
BarcodeReader.CONFIDENCE_LEVEL4
レベル0
レベル1
レベル2
レベル3
レベル4
レベル1
8 チェックサム確認機能 読み込み対象のバーコード種別がCODE39の場合、チェックサムを確認してから読み取り結果を出力する機能です。 setChecksumVerification false
true
オフ
オン
オフ
9
(Codabar用)
Start/Stop文字表示機能
Codabarの先頭と末尾のアルファベットを表示させる機能です。 setCodabarStartStopTransmission false
true
オフ
オン
オフ
10
(QR Code用)
白黒反転コード読み取り機能
白黒反転したQRコードを読み取りできる機能です。
「オン」設定時は反転していない通常のQRコードは読み取りできません。
setQrWhiteOverBlack false
true
オフ
オン
オフ

実際に情報を取得してみる

BarcodeReaderを使用するためには下記の手続きを実施する必要があります。

手続き イメージ

実際のコードは下記のとおりです。

BarcodeReaderインスタンスを生成

BarcodeReaderのインスタンスを生成します。この時、BarcodeReaderに対する設定ができます。対象バーコード種別は必ず指定が必要です。

設定値はBarcodeReaderAPI一覧を参照ください。

コードは横スクロールさせて確認することができます。

    BarcodeReader barcodeReader = BarcodeReader.Builder()
        // 対象バーコード種別の設定 例)QRコードとEAN-8を有効にする場合
        .setBarcodeFormats(
                BarcodeReader.FORMAT_QR_CODE,
                BarcodeReader.FORMAT_EAN_JAN_8
        )
        .Builde();

BarcodeReader.bindToLifecycle()を実行

BarcodeReaderを利用可能にするため、LifecyleOwnerに対して1回実行してください。

パラメータにはContextとLifecycleOwnerの指定が必要です。ActivityのonCreateで行う場合以下の例のようになります。

コードは横スクロールさせて確認することができます。

    barcodeReader.bindToLifecycle(
        this, // ActivityをContextとして渡す
        this  // LifecycleOwnerとして渡す
    )

スキャンの開始

BarcodeReader.scan()を実行することにより、バーコードスキャンを開始します。

スキャンは非同期で行われるため、scan()メソッドはすぐにリターンし、CompletableFuture<Barcode>が返ります。

参考:CompletableFuture | Android Developers

別ウィンドウでAndroid Developersのウェブサイトにリンクします。

コードは横スクロールさせて確認することができます。

    CompletableFuture<Barcode> scanning = barcodeReader.scan();

スキャン結果の処理およびエラーの処理

Completeable<Barcode>のwhenComplete()などを使い、バーコードが読み取れた際の動作を記述します。

whenCompleteのパラメータ(コールバック)であるactionは、下記のいずれかの状態になったときに実行されます。

1.バーコードが読み取れた場合

この場合、第一パラメータであるresultにnullでないBarcodeクラスのインスタンスが入っており、バーコードの種類、読取り結果(文字列/バイナリ)を取得可能。第二パラーメータexはnullとなっている。

  • バーコード種別:getFormat(型:String)
  • 結果(文字列):getData(型:String)
  • 結果(バイナリ):getRawData(型:byte[])

2.スキャン開始(scan()の実行)からバーコードが読めないまま10秒が経過した

この場合、第一パラメータであるresultにnullでないBarcodeクラスのインスタンスが入っており、バーコードの種類、読取り結果(文字列/バイナリ)を取得可能。第二パラーメータexはnullとなっている。第一パラメータのresultはnullとなっており、第二パラメータのexはCancellationExceptionのインスタンスとなっています。

3.エラーが発生した

第一パラメータのresultはnullとなっており、第二パラメータのexは、CancellationException以外のExceptionインスタンスとなっています。

発生する可能性のあるエラーについては、BarcodeReader.scan()のjavadocを参照してください。

コードは横スクロールさせて確認することができます。

    scanning.whenComplete((result, ex) ->{
        // 結果はコールバックとして受け取る
        // ex != nullの場合、キャンセルまたはエラー
        if (ex != null){
            if(ex instanceof CancellationException){
                // タイムアウトによるキャンセルの場合
                // resultText.postValue("Cancelled")
                Log.d(TAG, "scan cancelled");
            }else{
                resulttext.postValue("Error:"+ ex.getMessage());
                ex.printStackTrace();
            }
        } else {
            // バーコード読取りに成功した場合、resultにバーコードの情報が入る
            resultText.postValue(
                String.format(
                    "[%s] %s",
                    result.getFromat(),
                    result.getData()
                )
            );
        }
    })

AimerController APIについて

AimerController API メソッド

No 項目 概要 メソッド 引数 設定値 デフォルト
1 ライフサイクルとの関連付け このメソッド実行以後、ライフサイクルに合わせて自動的に適切なタイミングで初期化処理が行われます。 bindToLifecycle Context LifecycleOwner
2 エイマー点灯機能 端末背面に搭載されているエイマーが点滅する機能です。 setAimer AimerController.AIMER_OFF
AimerController.AIMER_ON
オフ
オン
3 ライフサイクルとの関連付けの破棄 現在のライフサイクルとの関連付けを切り、AimerController インスタンスの利用を終了します。
通常実行する必要はございません。
unbind なし

AimerControllerを使用するためには下記の手続きを実施する必要があります。

手続き イメージ

実際のコードは下記のとおりです。

AimerControllerインスタンスを生成

BarcodeReaderのインスタンスを生成します。

コードは横スクロールさせて確認することができます。

    AimerController aimerController = AimerController.Builder.builde();

AimerController.bindToLifecycle()を実行

AimerControllerを利用可能にするため、LifecyleOwnerに対して1回実行してください。

パラメータにはContextとLifecycleOwnerの指定が必要です。ActivityのonCreateで行う場合以下の例のようになります。

コードは横スクロールさせて確認することができます。

    aimerController.bindToLifecycle(
        this, // ActivityをContextとして渡す
        this  // LifecycleOwnerとして渡す
    );

エイマーのオン/オフ

AimerController.setAimer(AIMER_ON)を実行することによりエイマーが点滅します。同様にAimerController.setAimer(AIMER_OFF)により消灯します。

setAimer()の戻り値はCompletableFuture<VOID>です。

スキャンは非同期で行われるため、scan()メソッドはすぐにリターンし、CompletableFuture<Barcode>が返ります。

参考:CompletableFuture | Android Developers 

別ウィンドウでAndroid Developersのウェブサイトにリンクします。

エラー処理

CompletableFuture<VOID>のwhenComplete()などを使い、エラー処理を記述できます。

whenCompleteのパラメータ(コールバック)であるactionは、下記のいずれかの状態になったときに実行されます。

1.エイマーの制御に成功
ex = nullでactionが実行される。

2.エイマーの制御に失敗(非対応機種の場合など。通常は発生しない)
ex != nullでactionが実行される。exにはエラー内容が含まれる。

コードは横スクロールさせて確認することができます。

    buttonOn.setOnClickListener(view -> {
        aimerController.setAimer(AimerController.AIMER_ON)
            .whenComplete((result, ex) -> {
                if (ex != null){
                    // エラー処理
                }
            });
    });