[Android] zxingでQRコードを読み取る時に画面が横回転しないようにする


画面が横になる・・・

AndroidでQRコードを読み取るとき,zxing-android-embeddedというライブラリを使うことがあるかと思います.

しかし問題なのが,もともとバーコード用のライブラリのためリファレンス通りの使い方ではカメラが横回転(ランドスケープモード)してしまいます.QRコードだけなら,縦のまま読み取りたいですね.

一見Activityのandroid:screenOrientationportraitにするだけかと思いきや,裏で別のActivityを呼び出しているようで,これだけでは治りません.ということで,縦にしましょう.

たぶん2分くらいで終わります.


(こんなかんじ.つらい.)

依存関係

gradleに書いてない方は,書いてから始めましょう.

build.gradle
dependencies {
    ...
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
}

CaptureActivityを継承したActivityをつくる

zxingを導入すると,com.journeyapps.barcodescanner.CaptureActivityたるActivityが存在することがわかります.IntentIntegratorの中を見ていると,このCaptureActivityがどうやらデフォルトで使用されているようです.ということで,これを継承したActivityを宣言しましょう.中身は空で構いません.

適当に好きなファイルに宣言してもいいですし,新しくこれ専用のファイルを作ってあげてもいいです.

MyCaptureActivity.kt
class MyCaptureActivity : CaptureActivity()

AndroidManifestを編集する

新しくActivityを作ったので,manifestファイルに記述します.

android:name以外は記述しなくても縦画面になりましたが,一応書いておくと安心ですね.

AndroidManifest.xml
<application>
    ...
    <activity
        android:name=".MyCaptureActivity"             
        android:screenOrientation="portrait"
        android:stateNotNeeded="true"
        android:theme="@style/zxing_CaptureTheme"
        android:windowSoftInputMode="stateAlwaysHidden">
    </activity>
</application>

IntentIntegratorのcaptureActivityにセットする

最後に適用して終わりです.
QRコードカメラのintentを発行するときはIntentIntegratorを使うと思いますが,生成したインスタンスのcaptureActivityに先ほど宣言したクラスを割り当ててあげれば,画面が縦になります.

Activityから呼び出す場合とFragmentから呼び出す場合で,若干書き方が違います.

  • Activityの場合
MainActivity.kt

    val intentIntegrator = IntentIntegrator(this).apply {
        setPrompt("Scan a QR code")
        captureActivity = MyCaptureActivity::class.java
    }
    intentIntegrator.initiateScan()
  • Fragmentの場合
MyFragment.kt
    val intentIntegrator = IntentIntegrator.forSupportFragment(this).apply {
        setPrompt("Scan a QR code")
        captureActivity = MyCaptureActivity::class.java
    }
    intentIntegrator.initiateScan()

結果

こうだったのが

こうなりました!

おわりに

けっこう過去に議論されていた問題みたいで,公式レポジトリのIssueやStackOverflowには情報がありましたが,日本語にはなっていないみたいですね.

setScreenOrientation() property for IntentIntegrator #16

Change QR Scanner orientation with ZXING in Android Studio

以上です,ありがとうございました.