개요
기존의 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 저장소 배포를 고려할 수 있다.