バーコード読み取り機能を使う
バーコード読み取り機能とは
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が提供する機能は次のとおりです。
2.AimerController:エイマーの単独制御機能
バーコードデコーダーやカメラ制御を3rdアプリベンダで用意し、エイマーの点灯、消灯制御のみをする機能
BarcodeReaderSDKのライフサイクル
BarcodeReaderSDKはライフサイクルを監視することで、各機能を動作させるために必要な処理を、自動的に適切なタイミングで行います。
そのため、Javaアプリ側では、onStart () と onStop() などで明示的に使用開始および停止を指示するのではなく、BarcodeReaderクラス、または AimerController クラスが持つ bindToLifecycle() メソッドを実行して、各機能に関連付けるライフサイクルを指定してください。
BarcodeReaderSDKはライフサイクルを監視し、その状態遷移に合わせて各機能を利用するために必要なリソースの初期化および解放処理を自動的に行います。
他のSDKとアプリ側でSDKの開始、終了処理が異なるため実装にご注意ください。
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となっている。
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){ // エラー処理 } }); });