ZXingで、QRコードを撮れる

# ZXingとは

* ZXing は Google が開発して公開している、様々な一次元や二次元のバーコードの生成/操作ができるオープンソースライブラリ
* https://github.com/zxing/zxing

# Androidプロジェクトに、ZXingライブラリを追加

```groovy:app/build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    ......
    compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
    compile 'com.google.zxing:core:3.2.0'
}
```

### zxing-android-embeddedとは
* https://github.com/journeyapps/zxing-android-embedded


# QRコードを取得するために、コード実装

### AndroidManifest.xml

```xml
 <uses-permission android:name="android.permission.CAMERA"/>
 <uses-permission android:name="android.permission.FLASHLIGHT"/>
```

### Activity実装

```xml:AndroidManifest.xml
 <activity
            android:name=".CaptureActivityAnyOrientation"
            android:screenOrientation="fullSensor"
            android:stateNotNeeded="true"
            android:theme="@style/zxing_CaptureTheme"
            android:windowSoftInputMode="stateAlwaysHidden" />
```

```java:CaptureActivityAnyOrientation.java
import com.journeyapps.barcodescanner.CaptureActivity;

public class CaptureActivityAnyOrientation extends CaptureActivity {
}
```

```java:MainActivity.java

        Button mBtnCamera = (Button) findViewById(R.id.camera_button);
        mBtnCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                IntentIntegrator integrator = new IntentIntegrator(LoginActivity.this);            
                integrator.setCaptureActivity(CaptureActivityAnyOrientation.class);
                integrator.setOrientationLocked(false);
                integrator.initiateScan();
            }
        });
```

```java:MainActivity.java
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (scanResult != null) {
            TextView qResultView = (TextView) findViewById(R.id.qr_text_view);
            qResultView.setText(scanResult.getContents());
            Log.d("scan", "==-----:  " + scanResult.getContents());
        }
    }
```

# QRコードを生成するために、コード実装

```java:MainActivity.java
       Button mBtnCreateQRcode = (Button) findViewById(R.id.create_qrcode);
        mBtnCreateQRcode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createQRcode();
            }
        });

......

    private void createQRcode() {

        Bitmap qr = null;
        try {
            qr = createQRCodeByZxing("http://google.co.jp", 400);
        } catch (WriterException e) {
            Log.d("createQRcode", "error: ", e);
        }

        try {
            File root = Environment.getExternalStorageDirectory();

            // 日付でファイル名を作成　
            Date mDate = new Date();
            SimpleDateFormat fileName = new SimpleDateFormat("yyyyMMdd_HHmmss");

            // 保存処理開始
            FileOutputStream fos = null;
            fos = new FileOutputStream(new File(root, fileName.format(mDate) + ".jpg"));

            // jpegで保存
            qr.compress(Bitmap.CompressFormat.JPEG, 100, fos);

            // 保存処理終了
            fos.close();
        } catch (Exception e) {
            Log.e("Error", "" + e.toString());
        }
    }

    public Bitmap createQRCodeByZxing(String contents,int size) throws WriterException {
        //QRコードをエンコードするクラス
        QRCodeWriter writer = new QRCodeWriter();

        //異なる型の値を入れるためgenericは使えない
        Hashtable encodeHint = new Hashtable();

        //日本語を扱うためにシフトJISを指定
        encodeHint.put(EncodeHintType.CHARACTER_SET, "shiftjis");

        //エラー修復レベルを指定
        //L 7%が復元可能
        //M 15%が復元可能
        //Q 25%が復元可能
        //H 30%が復元可能
        encodeHint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

        BitMatrix qrCodeData = writer.encode(contents, BarcodeFormat.QR_CODE, size, size, encodeHint);

        //QRコードのbitmap画像を作成
        Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        bitmap.eraseColor(Color.argb(255, 255, 255, 255)); //いらないかも
        for (int x = 0; x < qrCodeData.getWidth(); x++) {
            for (int y = 0; y < qrCodeData.getHeight(); y++) {
                if (qrCodeData.get(x, y) == true) {
                    //0はBlack
                    bitmap.setPixel(x, y, Color.argb(255, 0, 0, 0));
                } else {
                    //-1はWhite
                    bitmap.setPixel(x, y, Color.argb(255, 255, 255, 255));
                }
            }
        }

        return bitmap;
    }
```