Androidアプリで1次元バーコードを作成する方法1

今回はAndroidアプリで1次元バーコードを作成する方法を紹介する。
バーコードの作成は、Googleが開発した「ZXing」というライブラリを使用する。

1次元バーコードには様々な規格が存在するが、今回は「CODABAR(NW-7)」規格の作成方法を紹介する。

<方法概要>

1.Gradleの設定ファイルにZXingの依存関係を追記する
2.バーコードを表示するためのビューを追加する
3.バーコードを生成するためのソースコードを記述する

<方法詳細>

1.Gradleの設定ファイルにZXingの依存関係を追記する

プロジェクトにバーコードのライブラリであるZXingを取り込むために、build.gradleファイルの「dependencies」に「compile group: 'com.google.zxing', name: 'core', version: '3.2.1'」を追加する。

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "biz.accele.samplebarcode"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile group: 'com.google.zxing', name: 'core', version: '3.2.1'  //<-追加
}

追加すると画面右上に「Sync Now」のリンクが表示されるので、そのリンクを押下する。

f:id:MoonMtLab:20160917113525p:plain

2.バーコードを表示するためのビューを追加する

生成したバーコードを表示するための「ImageView」を画面レイアウト用のxmlに追加する。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F0E68C"
    tools:context="biz.accele.samplebarcode.MainActivity">

    <!-- バーコードを表示するためのImageView -->
    <ImageView
        android:id="@+id/result_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        />

</RelativeLayout>
3.バーコードを生成するためのソースコードを記述する

手順1でプロジェクトに取り込んだ「ZXing」ライブラリを使用して、バーコードを生成する。

MainActivity.java

package biz.accele.samplebarcode;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.CodaBarWriter;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView = (ImageView) findViewById(R.id.result_view);

        // バーコードの各種設定
        String targetData = "123456789012345";       //バーコードに変換する対象データ
        int    width      = 1000;                    //作成するバーコードの幅
        int    height     = 200;                     //作成するバーコードの高さ

        // CODABAR規格用のデータ変換クラスをインスタンス化する
        CodaBarWriter writer = new CodaBarWriter();

        try {

            // 対象データを変換する
            BitMatrix bitMatrix = writer.encode(targetData, BarcodeFormat.CODABAR, width, height); //...(1)

            // BitMatrixのデータが「true」の時は「黒」を設定し、「false」の時は「白」を設定する              //...(2)
            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] = bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE;
                }
            }

            // ビットマップ形式に変換する
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

            //ビットマップの回転(縦に表示するため)
            Matrix mat = new Matrix();
            mat.postRotate(90);
            Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, mat, true);

            // イメージビューに表示する
            imageView.setImageBitmap(bmp);

        } catch (WriterException e) {}
    }
}

[解説]
(1)
結果として受け取るBitMatrixは、booleanの2次元配列の様な型であり(厳密には異なるがイメージとして)、1要素が1ピクセルに相当する。

(2)
BitMatrixの情報に従い、要素が「true」の場合は塗りつぶし、要素が「false」の場合は塗りつぶさない処理を行えば、バーコードの描画情報となる。

[実行結果]

f:id:MoonMtLab:20160917113604p:plain:w300

Enjoy Programing!!