ZXingとは
- ZXing は Google が開発して公開している、様々な一次元や二次元のバーコードの生成/操作ができるオープンソースライブラリ
- https://github.com/zxing/zxing
Androidプロジェクトに、ZXingライブラリを追加
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とは
QRコードを取得するために、コード実装
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
Activity実装
AndroidManifest.xml
<activity
android:name=".CaptureActivityAnyOrientation"
android:screenOrientation="fullSensor"
android:stateNotNeeded="true"
android:theme="@style/zxing_CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden" />
CaptureActivityAnyOrientation.java
import com.journeyapps.barcodescanner.CaptureActivity;
public class CaptureActivityAnyOrientation extends CaptureActivity {
}
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();
}
});
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コードを生成するために、コード実装
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;
}