안드로이드/개발관련(Kotlin)

안드로이드에서 Zxing을 사용하여 QR코드 생성/스캔

닉네임못짓는사람 2023. 2. 27. 20:05
반응형

안드로이드에서는 QR코드를 아주 간단하게 생성, 스캔할 수 있다.

 

가장 먼저, gradle에 아래와 같은 코드를 입력하여 모듈을 추가해주도록 하자.

    implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
    implementation 'com.google.zxing:core:3.4.1'

gradle의 내용을 수정했으면, Android Studio우측 상단의 Sync Now를 눌러주는걸 절대 잊지말자.

 

다음으로 실제로 QR코드를 생성해보자.

    fun createQRCode(){
        val qrCode = QRCodeWriter()
        val bitMtx = qrCode.encode(
            intent.getStringExtra("id"),
            BarcodeFormat.QR_CODE,
            350,
            350
        )
        val bitmap: Bitmap = Bitmap.createBitmap(bitMtx.width, bitMtx.height, Bitmap.Config.RGB_565)
        for(i in 0 .. bitMtx.width-1){
            for(j in 0 .. bitMtx.height-1){
                var color = 0
                if(bitMtx.get(i, j)){
                    color = Color.BLACK
                }else{
                    color = Color.WHITE
                }
                bitmap.setPixel(i, j, color)
            }
        }
        binding.qrImage.setImageBitmap(bitmap)
    }

먼저, QRCodeWriter객체를 만들어주고, QR코드의 내용, 크기 등을 지정해주자.

위 코드에서는 qrCode.encode이하 첫 줄 부터 순서대로 QR코드의 내용,

Barcode의 Format, 여기서는 QR코드를 사용할 것이니 당연히 QR_CODE를 추가해준다.

그 다음으로 QR코드의 Width, Height이다.

 

이렇게 QR코드 정보를 정했으면, 이를 createBitmap을 사용해서 bitmap으로 만들어주자.

만들어진 bitmap을 ImageView에 넣어주면 끝이다!

 

다음은 위에서 만든 QR코드를 스캔해보도록 하자.

QR코드를 스캔하려면, 먼저 아래 코드를 Manifest의 Application이하에 넣어주어야 한다.

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

위 액티비티가 우리가 QR코드를 스캔할 때 사용할 액티비티가 된다.

이때 tools를 찾을 수 없다고 나오는 사람은 Manifest상단에 tools를 추가해주면 된다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

사전 작업이 끝났다면, 이제 실제로 QR코드를 스캔해보자.

    fun scanQRCode(){
        val integrator = IntentIntegrator(this)
        integrator.setBeepEnabled(false)
        integrator.setOrientationLocked(true)
        integrator.setPrompt("QR코드를 찍어주세요.")
        integrator.initiateScan()
    }

위 코드는 QR코드를 스캔하는 액티비티로 이동하는 코드이다.

setBeepEnable은 QR코드 스캔 시 소리를 낼 지 설정하는 부분이며,

setOrientationLocked는 화면 회전을 막을지 말지 설정하는 부분이다.

setPrompt는 예상이 가겠지만, QR코드 스캔 액티비티 하단에 띄울 텍스트를 입력해준다.

 

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val result: IntentResult =
            IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        if(result != null) {
            if (result.contents == null) {
                Log.e("this", "잘못된 QR코드입니다.")
            } else {
            	Log.e("this", result.contents.toString())
            }
        }
        else{
            super.onActivityResult(requestCode, resultCode, data)
        }
    }

이렇게 QR코드 스캐너를 통해서 QR코드를 스캔하게되면, onActivityResult함수가 자동으로 실행된다.

간단하게 내용만 보자면, result.contents == null은 QR코드를 스캔해서 얻은 내용이 null일 때이다.

여기선 잘못된 QR코드라는 메세지를 Log로 찍어보자.

 

다음으로 result.contents가 null이 아니면 Log로 QR코드에 담긴 데이터를 찍어보도록 하자.

이렇게 안드로이드에서 간단하게 QR코드를 생성/스캔하는 방법에 대해 알아보았다.

반응형