2020. 12. 30. 20:03ใ๐ฑAndroid/๐ฉ๐ป๐ป Android ๊ฐ๋ฐ ์ผ์ง
QR์ฝ๋ ์ค์บ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ง์ ๊ตฌ๊ธ๋ง์ ํด๋ณธ ๊ฒฐ๊ณผ QR์ฝ๋ ์ค์บ๋ ๋ง๋ค ๋ Zxing ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ๋์์ด์!
๊ทธ๋์ ์ค๋์ ์์ ๊ฐ์ Zxing ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ QR์ฝ๋ ์ค์บ๋ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํด๋๋ฆฌ๋ ค๊ณ ํฉ๋๋ค.
์ ๋ ์ฃผ๋ก ๊ฐ๋ฐํ ๋ Kotlin์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Kotlin์ผ๋ก ์ฌ์ฉ๋ฒ์ ๋ํด ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ ๋งํฌ๋ Zxing ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์ ์ ๋๋ค !
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 ๋ก ๋ฐ์ ์ ์์ต๋๋ค!
'๐ฑAndroid > ๐ฉ๐ปโ๐ป Android ๊ฐ๋ฐ ์ผ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android/Kotlin] ๊ฐ๋จํ Animation Transition ๊ตฌํํ๊ธฐ (0) | 2021.01.02 |
---|---|
[Android/Kotlin] Round TabLayout ๋ง๋ค๊ธฐ (2) | 2020.12.30 |
[Android/Kotlin] ๊ธฐ๋ณธ TabLayout ๋ง๋ค์ด๋ณด๊ธฐ (0) | 2020.12.30 |