Android에서 ZXing을 활용한 QR 코드 스캔 및 생성 라이브러리 통합

개요

기존의 QR 코드 스캔 기능 구현 방식을 개선하고 재사용성을 높이기 위해, ZXing 기반의 Android 전용 라이브러리를 별도로 분리하여 관리할 수 있도록 설계했다. 이 라이브러리는 스캔과 동시에 QR 코드 생성 기능까지 포함하며, 앱 프로젝트에 간편하게 통합할 수 있다.

주요 기능 미리보기

  • 카메라를 이용한 실시간 QR 코드 인식
  • 입력 텍스트 기반의 QR 코드 이미지 생성
  • 사용자 정의가 쉬운 UI 및 동작 로직

실제 동작은 카메라 미리보기 화면에서 탐지 후 진동 피드백과 함께 결과를 반환하며, 생성된 코드는 지정된 ImageView에 즉시 표시된다.

프로젝트에 라이브러리 추가하기

1. 소스 코드 복사

GitHub 저장소(QrCodeLib)에서 전체 프로젝트를 다운로드하거나 클론한 후, zxing-lib 디렉터리를 자신의 앱 프로젝트 루트에 복사한다.

2. 모듈 의존성 설정

프로젝트 수준의 settings.gradle 파일에 아래와 같이 모듈을 포함시킨다:

include ':app', ':zxing-lib'

앱 모듈 (예: app/build.gradle)의 의존성 섹션에 다음 줄을 추가:

dependencies {
    implementation project(':zxing-lib')
}

3. 매니페스트 등록

AndroidManifest.xml에 필요한 권한과 활동(Activity)을 선언해야 한다:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application ...>
    <activity android:name="com.google.zxing.activity.CaptureActivity" />
</application>

QR 코드 스캔 실행

메인 액티비티에서 스캔 화면을 호출하려면 다음과 같은 인텐트를 사용:

Intent intent = new Intent(this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE_SCAN);

결과 처리

스캔 완료 후 결과는 onActivityResult 콜백에서 처리:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK && data != null) {
        String result = data.getStringExtra("SCAN_RESULT");
        TextView resultView = findViewById(R.id.tv_result);
        resultView.setText(result);
    }
}

QR 코드 생성 기능 사용법

문자열로부터 QR 코드 비트맵을 생성하려면 아래와 같이 유틸리티 클래스를 활용:

EditText inputText = findViewById(R.id.et_content);
ImageView qrImage = findViewById(R.id.img_qrcode);

String content = inputText.getText().toString();
Bitmap qrBitmap = QrCodeUtils.generate(content, 400, 400);

if (qrBitmap != null) {
    qrImage.setImageBitmap(qrBitmap);
} else {
    Toast.makeText(this, "코드 생성 실패", Toast.LENGTH_SHORT).show();
}

QR 코드 생성기 구현 세부사항

QrCodeUtils.java는 ZXing 핵심 API를 래핑하여 간편하게 비트맵을 생성하도록 돕는 클래스다:

public class QrCodeUtils {

    public static Bitmap generate(String text, int width, int height) {
        if (text.isEmpty()) return null;

        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        hints.put(EncodeHintType.MARGIN, 1);

        try {
            BitMatrix matrix = new MultiFormatWriter()
                .encode(text, BarcodeFormat.QR_CODE, width, height, hints);
            
            return toBitmap(matrix);
        } catch (WriterException e) {
            e.printStackTrace();
            return null;
        }
    }

    private static Bitmap toBitmap(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                bitmap.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);
            }
        }
        return bitmap;
    }
}

조정 가능한 주요 파라미터

  • ErrorCorrectionLevel: H, L, M, Q 중 선택 가능. 높을수록 손상된 상태에서도 인식률이 높아지나, 데이터 밀도 증가.
  • MARGIN: 생성된 코드 주변의 여백 크기. 기본값은 1이며, 0으로 설정 시 테두리 없음.

통합 방식에 대한 설명

현재 이 라이브러리는 공개 레포지토리(jCenter 등)에 배포되지 않았으며, 직접 소스 코드를 복사해 프로젝트에 포함하는 방식을 사용한다. 이 방법의 장점은 다음과 같다:

  • UI 문자열, 색상, 아이콘 등을 프로젝트 맞춤형으로 쉽게 수정 가능
  • 스캔 성능 최적화나 특수 요구사항 반영이 용이함
  • 외부 네트워크 없이도 빌드 가능

향후 필요 시 AAR 형식이나 Maven 저장소 배포를 고려할 수 있다.

태그: ZXing QR코드 안드로이드 바코드스캔 이미지생성

6월 29일 20:50에 게시됨