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 のカメラって何か問題あったりするの???