본문 바로가기
Android

QR Code scanner 구현

by 아도리 2023. 2. 19.

QR Code를 스캔하는 안드로이드 앱을 자바 코드로 구현해보겠습니다.

 

1단계: build.gradle에 종속성(dependency) 추가하기
앱의 build.gradle 파일에 다음 종속성을 추가합니다:

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

2단계: 안드로이드 매니페스트.xml에 권한 추가하기
앱의 AndroidManifest.xml 파일에 다음 권한을 추가합니다:

<uses-permission android:name="android.permission.CAMERA" />

3단계: QR코드 스캔을 위한 UI 만들기
QR 코드를 스캔할 활동에 대한 레이아웃 파일을 만듭니다.
바코드를 스캔하기 위한 DecoratedBarcodeView를 추가합니다:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.journeyapps.barcodescanner.DecoratedBarcodeView
            android:id="@+id/barcodeView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </RelativeLayout>

4단계: QR코드 스캔 로직 구현하기
활동의 Java 파일에서 QR 코드를 스캔하는 로직을 구현해야 합니다. 다음은 예제입니다:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.DefaultDecoderFactory;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import com.journeyapps.barcodescanner.camera.CameraSettings;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final int CAMERA_REQUEST_CODE = 100;
    private boolean hasCameraPermission = false;

    private DecoratedBarcodeView barcodeView;

    private BarcodeCallback barcodeCallback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            Toast.makeText(MainActivity.this, result.getText(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        barcodeView = findViewById(R.id.barcodeView);
        barcodeView.decodeContinuous(barcodeCallback);
        Collection<BarcodeFormat> formats = Arrays.asList(BarcodeFormat.QR_CODE);
        barcodeView.setDecoderFactory(new DefaultDecoderFactory(formats));
        barcodeView.setStatusText("");

        CameraSettings settings = barcodeView.getBarcodeView().getCameraSettings();
        settings.setFocusMode(CameraSettings.FocusMode.AUTO);

        hasCameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;

        if (!hasCameraPermission) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (hasCameraPermission) {
            barcodeView.resume();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (hasCameraPermission) {
            barcodeView.pause();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CAMERA_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                hasCameraPermission = true;
                barcodeView.resume();
            }
        }
    }
}

이 코드에서는 카메라 미리보기를 표시하고 QR 코드를 스캔하기 위해 ZXing 라이브러리의 `DecoratedBarcodeView`를 사용하고 있습니다.
또한 스캔 과정의 결과를 처리하기 위해 `BarcodeCallback`을 구현하고 있습니다.
카메라 권한을 요청하고 사용자의 응답을 처리하기 위해 `onRequestPermissionsResult()` 메서드를 사용하고 있습니다. 

5단계: QR코드 스캔 앱 테스트하기
이제 앱을 빌드하고 실행하여 QR코드 스캔 기능을 테스트할 수 있습니다.

앱을 실행시키면 QR 코드 스캔하는 화면이 나오며, 앱에 스캔한 QR 코드의 콘텐츠가 포함된 토스트 메시지가 표시됩니다.

예제로 구현된 QR 코드 스캔 기능을 활용해서 다양한 앱을 만드실 수 있을 겁니다.

 

관련 구현된 내용은 아래 깃허브에 있습니다.

https://github.com/Sungdong9Kim/QRCodeScannerExample

댓글