QR / BARコードを生成してスキャンします



この記事では、QRコード(またはバーコード)のジェネレーターやスキャナーをアプリケーションに統合する方法の簡単な例を示します。これにより、デバイスからデバイスに少量の情報を転送する作業が容易になります。



QRコードは古いバーコード(以下「バーコード」と呼びます)に取って代わり、私たちの生活の一部になりつつあり、サイトへのリンクの転送から複雑な認証および購入システムへのさまざまなソリューションで使用されています。



QRコードの詳細については、QRコードを読むの記事から詳しく知ることができます。



タスクを完了するには、2つのプロジェクトから2つのライブラリが必要です。



QRコードをスキャンする


ZBarバーコードリーダーのライブラリがスキャンに使用されるので、 始めましょう。

  1. プロジェクトzbar.jarに追加
  2. libiconv.soおよびlibzbarjni.soライブラリをネイティブプロジェクトに追加します。これらのライブラリは、カメラからの画像を実際に分析および認識する役割を果たします。

    時間。
  3. ネイティブライブラリをメモリにロードします

    static { System.loadLibrary("iconv"); }
          
          



  4. スキャナーを初期化する

     scanner = new ImageScanner(); scanner.setConfig(0, Config.X_DENSITY, 3); //       scanner.setConfig(0, Config.Y_DENSITY, 3);
          
          



  5. 次に、カメラのプレビューから新しい各フレームをスキャナーに渡します

     PreviewCallback previewCb = new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { String lastScannedCode; codeImage.setData(data); int result = scanner.scanImage(codeImage); if (result != 0) { SymbolSet syms = scanner.getResults(); for (Symbol sym : syms) { lastScannedCode = sym.getData(); } } } }
          
          



  6. その結果、 lastScannedCodeで認識されたコードを取得します。

    ここには1つの機能があります。カメラの前にQRコードがない場合でも、 result = scanner.scanImage(codeImage)は正しい結果を返すことがあります。 つまり、通常のぼやけた画像でもカメラが何かを認識することがあります。 したがって、読み取ったコードのサイズまたは予想される形式への準拠に関する追加チェックを導入することをお勧めします。




QRコードを生成します


この場合、 ZXingライブラリのリソースはすでに使用されています。

入力パラメーターencodeAsBitmap :エンコード用のテキストまたはコード、エンコードする標準、出力イメージのサイズ。

 Bitmap barcode_bitmap = encodeAsBitmap(text, BarcodeFormat.QR_CODE, 200, 200); targetImageView.setImageBitmap(barcode_bitmap); private static Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) throws WriterException { String contentsToEncode = contents; if (contentsToEncode == null) { return null; } Map<EncodeHintType, Object> hints = null; String encoding = guessAppropriateEncoding(contentsToEncode); if (encoding != null) { hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); hints.put(EncodeHintType.CHARACTER_SET, encoding); } MultiFormatWriter writer = new MultiFormatWriter(); BitMatrix result; try { result = writer.encode(contentsToEncode, format, img_width, img_height, hints); } catch (IllegalArgumentException iae) { // Unsupported format return null; } int width = result.getWidth(); int height = result.getHeight(); int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; }
      
      





バーコードはどうですか?


スキャナーは、箱から出してすぐにすべてのタイプのバーコードを修正なしで認識します



ジェネレーターは単に修正されるだけでなく、非常に簡単に修正されます。

encodeAsBitmap関数で、 Code 128標準バーコードに対応するBarcodeFormat.CODE_128のようなBarcodeFormat.QR_CODEではなくformatフィールド渡します。



最後のヒント


カメラでの作業は、異なるプラットフォームで独自の特性を持つ場合があることに留意してください。


メソッドに気づいた

 public void onPreviewFrame(byte[] data, Camera camera) { codeImage.setData(data); .... }
      
      



カメラからの新しいプレビューフレームごとにフレームバッファーが絶えず作成およびクリアされるため、メモリが常に失われます(メモリリークがあります)。

これを回避するために、 CallbackBuffer使用して 、プレビューフレームに静的バッファーを割り当てることができます。

それは本当にメモリリークを取り除くのに役立ち、さらにカメラからのプレビュー画像のフレームレートを増加させます。

しかし! 、プレビューバッファーを使用したくない電話モデルを見つけました。まだ見つからなかったという事実ではなく、この例ではより信頼性の高い方法を残しました。



バーコードの生成には、選択した標準に応じた制限があります。最大サイズ(バイト単位)、使用可能な文字など

表示するバーコードがストアスキャナーと互換性があることを確認するために、 線形バーコードの機能を学習します


Gradleビルドシステムを使用するプロジェクトで.soライブラリを使用する場合は、次の手順に従います。次の構造を持つjar iconv.jarファイルを作成します。

  • lib /
  • lib / x86
  • lib / armeabi
  • lib / armeabi-v7a


セクションに依存関係を追加します

コンパイルファイル( 'libs / iconv.jar')

または、すべてのJARファイルを個別に記述しないようにするための、より普遍的なオプション:

 dependencies { compile fileTree(dir: 'lib', include: '*.jar') }
      
      







UPD。 GitHubにソースコードをダウンロードしました

プロジェクトの出力で発生したこと(1つのボトル内のジェネレーターとスキャナー):








All Articles