안드로이드 앱에서 QR코드를 생성하고 스캔하는 방법을 소개한다.
물론 직접 구현하지는 않고 ZXing 라이브러리를 사용할 것이다.
ZXing ?
우리가 사용할 라이브러리는 'ZXing Android Embedded' 이다 ↓
깃허브에서는 다음과 같이 소개하고 있다.
"디코딩을 위해서 사용하는 Android용 바코드 스캔 라이브러리"
위 소개에서는 디코딩하는 역할만 언급되었지만,
바코드를 디코딩하는 것 뿐만 아니라 데이터를 인코딩하여 바코드를 생성할 수도 있다.
그리고 그 다음 문구는
"공식 zxing 라이브러리를 기반으로 제작되었다"
즉, 원본 라이브러리는 별도로 존재한다 ↓
우리가 사용해볼 라이브러리는 공식 ZXing 라이브러리를
더욱 편리하게 사용할 수 있게끔 개조한 라이브러리라는 것을 알 수 있다.
오픈소스 최고 👍
구글에 "안드로이드 zxing" 을 검색하면 첫 페이지 90% 이상의 결과가
우리가 사용할 'ZXing Android Embedded' 라이브러리다.
역시 오픈소스는 결국 편의성이 좋은 라이브러리가 승리한다.
사용해보자
QR 코드를 생성하고, 생성한 QR 코드를 스캔하는 예제를 다뤄볼 것이다.
✅ build.gradle 의존성 설정
implementation("com.journeyapps:zxing-android-embedded:4.3.0")
✅ QR 코드 생성
BarcodeEncoder().encodeBitmap("문자열 데이터", BarcodeFormat.QR_CODE, width, height)
BarcodeEcoder 클래스를 사용하여 QR 코드를 생성하며,
encodeBitmap 함수는 비트맵을 반환한다.
따라서 다음과 같이 응용하여 이미지뷰에 띄워본다.
val content = "QR Test!"
val bitmap = BarcodeEncoder().encodeBitmap(content, BarcodeFormat.QR_CODE, 200, 200)
bind.qrImage.setImageBitmap(bitmap)
결과)
화면에 위와 같은 QR 코드가 출력되었다.
QR 코드 스캔 예제에서 위 QR 코드를 사용할 것이니, 따로 저장해놓자.
✅ QR 코드 스캔
스캔을 해야하니 Manifest 파일에 카메라 관련 권한을 추가해주자.
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
<uses-permission android:name="android.permission.CAMERA" />
액티비티에서 QR 코드 스캔을 실행해준다.
// 런처 세팅
val launcher = registerForActivityResult(ScanContract()) { result ->
if (result.contents != null) {
Log.d(TAG, "QR 코드 스캔 결과 : ${result.contents}")
}
}
// 스캔할 시점에서
launcher.launch(ScanOptions())
ActivityResultLauncher를 이용하여 스캔 전용 액티비티로 다녀오는 원리다.
그리고 QR 코드 생성 예제에서 생성했던 QR 코드를 스캔해본다.
'삑' 소리와 함께 이전 액티비티로 되돌아온다.
QR 코드를 생성할 때 입력했던 데이터가 그대로 출력되는 것을 확인할 수 있다.
✅ 스캔 화면 방향 세로 고정
Manifest 파일에서 해당 액티비티의 Orientation을 지정해주면 된다.
<activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="portrait"
tools:replace="screenOrientation" />
이제 가로모드로 전환되지 않고 세로모드가 고정되어 사용할 수 있다.
QR코드를 다룰 수 있는 ZXing 라이브러리에 대해 알아보았다.
코드 1줄이면 QR 코드를 생성할 수 있고, 2~3줄로 QR 코드를 스캔할 수 있으니
정말 편리하게 잘 만들었다고 느껴졌다.
요즘 QR코드가 워낙 폭넓게 사용되다보니, 알아두면 유용하게 사용할 수 있을 것 같다.