[Android/Kotlin] Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ QR์ฝ”๋“œ ์Šค์บ๋„ˆ ๋งŒ๋“ค๊ธฐ

2020. 12. 30. 20:03ใ†๐Ÿ“ฑAndroid/๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Android ๊ฐœ๋ฐœ ์ผ์ง€

๋ฐ˜์‘ํ˜•

QR์ฝ”๋“œ ์Šค์บ๋„ˆ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณธ ๊ฒฐ๊ณผ QR์ฝ”๋“œ ์Šค์บ๋„ˆ ๋งŒ๋“ค ๋•Œ Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์–ด์š”!

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ์œ„์™€ ๊ฐ™์€ Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ QR์ฝ”๋“œ ์Šค์บ๋„ˆ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ €๋Š” ์ฃผ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ Kotlin์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Kotlin์œผ๋กœ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜ ๋งํฌ๋Š” Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ ์ž…๋‹ˆ๋‹ค !

 

journeyapps/zxing-android-embedded

Barcode scanner library for Android, based on the ZXing decoder - journeyapps/zxing-android-embedded

github.com

 

 

 

Build, Gradle์— Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๊ธฐ

- SDK Version 24 ๋ฏธ๋งŒ ์ผ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

implementation('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false }
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'com.google.zxing:core:3.3.0'

- SDK Version 24 ์ด์ƒ ์ผ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
implementation 'androidx.appcompat:appcompat:1.0.2'

 

 

๊ถŒํ•œ ์„ค์ • ํ•ด์ฃผ๊ธฐ

QR์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜๋ ค๋ฉด Camera ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ sdk overrideLibrary ์ฝ”๋“œ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

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

 

QR์ฝ”๋“œ ์Šค์บ๋„ˆ ์นด๋ฉ”๋ผ ์„ธ๋กœ๋ชจ๋“œ ์ ์šฉํ•˜๊ธฐ

QR์ฝ”๋“œ ์Šค์บ๋„ˆ์˜ ์นด๋ฉ”๋ผ๋ฅผ ์„ธ๋กœ๋ชจ๋“œ๋กœ ์ ์šฉํ•˜๋ ค๋ฉด screenOrientation ์†์„ฑ์„ fullSensor๋กœ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

<activity 
	android:name="com.journeyapps.barcodescanner.CaptureActivity"
	android:screenOrientation="fullSensor"
	tools:replace="screenOrientation"/>

 

QR์ฝ”๋“œ ์Šค์บ๋„ˆ Activity ๋งŒ๋“ค์–ด์ฃผ๊ธฐ

QR์ฝ”๋“œ ์Šค์บ๋„ˆ๋กœ ์‚ฌ์šฉํ•  Activity์— screenOrientation, stateNotNeeded, windowSoftInputMode ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”!

  <activity
            android:name=".QrcodeScanActivity"
            android:screenOrientation="portrait"
            android:stateNotNeeded="true"
            android:windowSoftInputMode="stateAlwaysHidden" />

 

QrcodeScanActivity.kt 

private fun initQRcodeScanner() {
    val integrator  = IntentIntegrator(this)
    integrator.setBeepEnabled(false)
    integrator.setOrientationLocked(true)
    integrator.setPrompt("QR์ฝ”๋“œ๋ฅผ ์ธ์ฆํ•ด์ฃผ์„ธ์š”.")
    integrator.initiateScan()
}

setBeepEnabled ๋Š” QR์ฝ”๋“œ ์Šค์บ”์‹œ ์†Œ๋ฆฌ ๋‚˜๊ฒŒ ํ•˜๋ ค๋ฉด true ์•„๋‹ˆ๋ฉด false๋กœ ์ง€์ •ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

setOrientationLocked ๋Š” ์„ธ๋กœ,๊ฐ€๋กœ ๋ชจ๋“œ๋ฅผ ๊ณ ์ • ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

setPrompt(" ")์—๋Š” ์›ํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

initiateScan( )์„ ํ†ตํ•ด Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ QR์ฝ”๋“œ ์Šค์บ๋„ˆ๊ฐ€ ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๊ณ , QR์ฝ”๋“œ ์Šค์บ”์˜ ๊ฒฐ๊ณผ ๊ฐ’์€ onActivityResult ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

 

 

// qr์ฝ”๋“œ ์ฃผ์†Œ ๋ฐ˜ํ™˜ ์‹œ์—
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val result : IntentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        var toast = Toast(this)
        if(result !=null) {
            if(result.contents == null) {
                // qr์ฝ”๋“œ์— ์ฃผ์†Œ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋’ค๋กœ๊ฐ€๊ธฐ ํด๋ฆญ ์‹œ
                toast.drawCustomToast("QR์ฝ”๋“œ ์ธ์ฆ์ด ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
                finish()
            } else {
                //qr์ฝ”๋“œ์— ์ฃผ์†Œ๊ฐ€ ์žˆ์„๋•Œ -> ์ฃผ์†Œ์— ๊ด€ํ•œ Toast ๋„์šฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
                toast.initQrcodeToast(result.contents)
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }

    }

QR์ฝ”๋“œ ์Šค์บ๋„ˆ๋กœ ์Šค์บ” ๋œ ์ฃผ์†Œ๋Š” IntentResult.contents ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

 

 

 

๋ฐ˜์‘ํ˜•