AndroidStudioでサクっとQRCode読むコード

QRCode を読む機能を持ったアプリを、とにかく楽して作ってみようと思った。


で、見つけたのがコレ。

QRCode 読むライブラリでメジャーな ZXing をすっごく簡単に使えるようにしてくれるライブラリ。


README を見ると

IntentIntegrator.initiateScan(this);    // `this` is the current Activity or Context

これだけで QRCode を読み込む Intent が起動するらしい。
楽チン!!!


というわけで、Android Studio でこのライブラリを使おうとしたんだけど、相変わらず gradle な部分であれこれしたので忘れないうちにメモ。

ライブラリ読み込みの設定でエラー

READMEにはライブラリ読み込みの為に以下のように build.gradle に加えろって書いてある。

repositories {
    mavenCentral()

    maven {
        url "https://raw.github.com/embarkmobile/zxing-android-minimal/mvn-repo/maven-repository/"
    }
}

dependencies {
    compile 'com.google.zxing:core:2.2'
    compile 'com.embarkmobile:zxing-android-minimal:1.2.0@aar'
}

これ、パッケージ(プロジェクト?)の build.gradle に書くとエラーが出る。

Error:(15, 0) No signature of method: org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.compile() is applicable for argument types: (java.lang.String) values: [com.google.zxing:core:2.2]
Possible solutions: module(java.lang.Object)

buildscript の中に既に repositories と dependencies があるから、ついそこに加えれば良いのかな?って…。
実際には top level の repositories と dependencies に加える。


というわけで、app の方の build.gradle に既に dependencies があるのでこっちに加えた。
動作確認用に作ったものだとこんな感じ。

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

repositories {
    mavenCentral()

    maven {
        url "https://raw.github.com/embarkmobile/zxing-android-minimal/mvn-repo/maven-repository/"
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.1.0'

    compile 'com.google.zxing:core:2.2'
    compile 'com.embarkmobile:zxing-android-minimal:1.2.0@aar'

}

これで [Sync Project with Gradle Files] すると、今度はエラーが出なくなる。

zxing-android-minimal使ってみる

とりあえず、build.gradle の設定もできたので、後は README やらソースコードを見ながら使ってみた。

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Activity activity = this;
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                IntentIntegrator.initiateScan(activity);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (scanResult != null) {
            Log.d("qrtest", "code = " + scanResult.getContents());
            Log.d("qrtest", "format = " + scanResult.getFormatName());
        }
    }
}

超簡単!
とりあえず id を button にしたボタンをレイアウトに貼付けて、それをクリックしたら zxing-android-minimal が intent で起動。
読み込んだら onActivityResult に読み込んだ結果(コードとフォーマット)が返ってくる。
下記ページにある QRCode を読むと

code = http://www.touch4smart.com/download/10/
format = QR_CODE

こんな感じ。


とにかく楽をして実装したい場合には良いかも。
1つ気になるのは「ランドスケープ」でしか機能しないこと。
この件は Issues にしっかり書かれているのだけど、Android のカメラって何か問題あったりするの???