QR Code를 다뤄보자 (Feat. Zxing)

지프치프·2021년 11월 12일
0

Android

목록 보기
26/86
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

작년 이 맘때 캡스톤 프로젝트를 할 때 Zxing API를 활용해서
QR code 스캔 기능을 사용했었는데 다시 정리해보는 차원에서
글을 써보려 한다.

Zxing API(Zebra Crossing)는 매우 손쉽게 QR code를 스캔하거나 생성하는 기능을 제공한다.
아마 QR code API 중에선 가장 많이 쓰이는 API가 아닐까 생각한다.

Scan

우선 build:gradle에서 Dependency를 선언해준다.

implementation 'com.journeyapps:zxing-android-embedded:3.4.0'

이제 코드를 작성해보자

private lateinit var qrIntent : IntentIntegrator

qrIntent = IntentIntegrator(this)
qrIntent.setPrompt(getString(R.string.str_qr_prompt))
qrIntent.setOrientationLocked(true)
qrIntent.initiateScan()

인스턴스를 생성한 뒤에 여러가지 setup을 할 수 있게 제공하는데
간단하게 몇가지만 소개하자면

  • setPrompt - Scan 화면에서 하단 영역의 Text 설정
  • setOrientationLocked - 화면 회전 잠금 설정
  • setBeepEnabled - Scan 시 비프음 설정

setUp을 끝낸 뒤 initiateScan()을 호출하면
Scan을 하는 Activity가 호출된다.

몇가지가 더 있으니 자세한 것은 공식 문서를 참고하면 좋겠다.

Activity에서 QR code를 정상적으로 Scan했다면 결과값을
onActivityResult()를 통해 가져온다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        result?.contents?.let {
       	    // 넘어온 인자 it에 QR code의 내용이 담겨있다.
            // 정확히는 result?.contents가 QR code에 담겨있던 내용이다.
        }
    }

Create

QR 생성도 Scan 못지 않게 매우 간단하다.
먼저 코드를 살펴보자

    private fun createQR(imv: ImageView, data: String) {
        val multiFormatWriter = MultiFormatWriter()
        try {
            val bitMatrix = multiFormatWriter.encode(data, BarcodeFormat.QR_CODE, 200, 200)
            val bitmap = BarcodeEncoder().createBitmap(bitMatrix)
            imv.setImageBitmap(bitmap)
        } catch (e: Exception) {
            // no-op
        }
    }

ImageView에 만든 QR 코드를 넣는 함수이다.

multiFormatWriter.encode(data, BarcodeFormat.QR_CODE, 200, 200)
위 함수를 통해서 QR code를 생성하고

BarcodeEncoder().createBitmap(bitMatrix)
생성한 QR code를 bitmap으로 변환한 뒤

imv.setImageBitmap(bitmap)
ImageView에 넣어주는 방식이다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글