본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Android][kotlin] QR코드 스캐너 만들기 (QRCode Scan Example)

by MinChan-Youn 2022. 2. 18.

QRCode-Scan 예제코드

Git: https://github.com/younminchan/kotlin-study/tree/main/QRCode_kotlin

 

GitHub - younminchan/kotlin-study: kotlin-example

kotlin-example. Contribute to younminchan/kotlin-study development by creating an account on GitHub.

github.com

 

 

QRCode-Scan하는 방법에 대해서 알아보겠습니다.

먼저 QRCode를 Scan하기 위해서 필요한 프로젝트 설정을 합니다.

 

1. build.gradle(:app)

- QR코드 라이브러리를 추가

//QR-Code (minSDK: 23)
implementation ('com.journeyapps:zxing-android-embedded:3.6.0') { transitive = false }
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'

- ViewBinding설정

android{
	...
    
	buildFeatures{
        viewBinding true
    }
    
    ...
}

 

2. AndroidManifest.xml

- QRCode-Scan 실행되는 activity설정

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.qrcode_kotlin">

    <application
		
        ...
        
        <!-- QRCode Scan -->
        <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="fullSensor"
            tools:replace="screenOrientation" />
            
        ...
        
    </application>

</manifest>

 

3. MainActivity.kt

ViewBinding처리 및 메인액티비티에 QRCode클래스를 추가 및 클릭리스너 설정

//MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        var qrCodeScan = QRCodeScan(this)

        /** Click */
        binding.tvQrScan.setOnClickListener {
            qrCodeScan.startQRScan()
        }
    }
}

 

4. activity_main.xml

레이아웃 작업

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_qr_scan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#F0F0F0"
        android:padding="20dp"
        android:text="Start QR-Scan"
        android:textColor="#000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

레이아웃을 코드추가를 하면 다음과 같이 나오게됩니다.

 

 

5. QRCodeScan.kt

QR코드 스캔에 필요한 클래스를 구성해줍니다. 

중요한 부분은 주석을 달아두었으니 필요시 참고하여 수정하면 되겠습니다.

또 여기서 중요한 부분은 원래 activity start를 하게되면 main에 onActivityResult에서 다시 체크했었는데요. 최근에는 클린한 코드를 구성하기 위해 다음과 같이 activityResult변수를 따로 구성하여 launch해주는 방법을 사용하고 있습니다. 참고해주세요!

//QRCodeScan.kt
class QRCodeScan(private val act: MainActivity) {

    /** QRCode Scan */
    fun startQRScan(){
        val intentIntegrator = IntentIntegrator(act)

        intentIntegrator.setPrompt("안내선 안에 QR코드를 맞추면 자동으로 인식됩니다.") //QR코드 스캔 액티비티 하단에 띄울 텍스트 설정
        intentIntegrator.setOrientationLocked(false)                       //화면회전을 막을 것인지 설정 (default 세로모드)
        intentIntegrator.setBeepEnabled(false)                             //QR코드 스캔 시 소리를 낼 지 설정
        activityResult.launch(intentIntegrator.createScanIntent())
    }

    /** onActivityResult */
    private val activityResult = act.registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
        val data = result.data

        val intentResult: IntentResult? = IntentIntegrator.parseActivityResult(result.resultCode, data)
        if(intentResult != null){
            //QRCode Scan 성공
            if(intentResult.contents != null){
                //QRCode Scan result 있는경우
                Toast.makeText(act, "인식된 QR-data: ${intentResult.contents}", Toast.LENGTH_SHORT).show()
            }else{
                //QRCode Scan result 없는경우
                Toast.makeText(act, "인식된 QR-data가 없습니다.", Toast.LENGTH_SHORT).show()
            }
        }else{
            //QRCode Scan 실패
            Toast.makeText(act, "QR스캔에 실패했습니다.", Toast.LENGTH_SHORT).show()
        }

    }
}

 

자 여기까지 따라오셨다면 코드는 모두 작성하였습니다.

빌드를 한번 해보겠습니다.

 

- QRCode 예시를 아래 사진을 참고하여 스캔해주세요~

QR코드 예시

 

- 메인페이지

메이페이지

- QR스캔을 위해 카메라 실행된 화면

QRCode-Scan

 

- QRScan이 성공적으로 된 화면