swampの忘備録

エンジニアが、情報系のイベント行ったときとかプログラミングなどの情報工学について忘備録として書くつもりです。

Android6.0以降でZxingを使ったときにはまったこと

 AndroidQRを読み取るプログラムを書いているのですが、そこでちょっとした落とし穴にはまったので、忘れないように書いておきます。
 
 ここでは、起動と同時にカメラが起動させ、QRコードにかざすと自動的に読み取り、HelloWorldと表示された画面に遷移する単純なプログラムを書きます。

1.環境
 ・ Android6.0.1 (Huwei P9 Lite)
 ・ Android Studio 2.33

2.Zxingとは
 Androidなどで、QRコードバーコードを読み取ったり、生成したりするプログラムを作るときに便利なライブラリです。

3.Zxingの導入
 Zxingの導入は、build.gradleにコードを記述することで、簡単にできます。

f:id:swamptk:20180831111103p:plain

 (Module: app) と書いてあるほうに以下の2行のコードを記述します。

   ..........省略..........

   dependencies {

     ..........省略..........
       
     compile 'com.journeyapps:zxing-android-embedded:3.0.0@aar'
     compile 'com.google.zxing:core:3.3.0'

   }

4.カメラのパーミッションの許可

 Androidアプリで、QRコードを読み取るときなど、カメラを使う時は、カメラに対する使用許可を与えなければなりません。

 f:id:swamptk:20180831123310p:plain

 AndroidManifest.xmlというファイルに以下の1行を書き加えます。

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

5.MainActivity.javaの編集

メインアクティビティのonCreateメソッドを以下のように変更します。

    
    ..........省略..........

   @Override
   protected void onCreate(Bundle savedInstanceState) {
        
        ..........省略..........
        
        new IntentIntegrator(this).initiateScan();
   }

   ..........省略..........

6.いざ、実行!

 できたので、実行します。が、しかし…

f:id:swamptk:20180831132153p:plain
 
 「Androidのカメラに問題が発生しました。デバイスを再起動する必要があります」とエラーが出ます。

 もちろん、再起動して直るわけでもありませんし、実機で試しても同じです。


7.解決方法

 Android6.0からは、スマートフォン本体から個別にアプリケーションに対するカメラのアクセス許可を与えなければ動きません。
 
 そこで、スマートフォン本体から、
 「設定」→「アプリ」→「開発したアプリ名」→「権限」→「カメラ」を押すことで
 このアプリケーションに対するカメラのアクセス許可が出ます。

 この設定をした後、実行すると正常に動きます!


その他、読み取り結果を取得するなどの処理は、以下の参考ページをご覧ください。


参考ページ
iinpht.jeez.jp