728x90
반응형
예전에 Zxing 라이브러리로 QR코드 스캐너를 만들어 보았다.
날로먹은 기분이라 신이 났었다.
그리고 이제와서 내 입맛에 맞게 수정을 하려고 하니
캬.... 역시나.
이렇게 쉬울리가 없었다.
Zxing에서 파생된 여러 오픈소스들을 사용했지만 답을 찾을 수 없었다.
그래서 나온 결론.
"걍 내 입맛에 맞게 Zxing을 고치자."
먼저 내가 사용해본 라이브러리들을 나열해보자면...
- Zxing : 가장 기본이 됨
- ZXing Android Embedded : 별도의 화면을 만들지 않아도 된다.
- barcodescanner : 다양한 형태의 샘플을 볼 수 있다.
이런 각자의 장점이 있는데 3개 모두 공통점이 있다.
기존의 화면내에서 스캔과 확인을 동시에 할 수 없다는 것.
문제 사례 1.내가 만든 화면 안의 특정 정사각형 레이아웃에서QR코드를 읽기 위한 카메라를 작동시킨다고 가정하자.코드를 읽으면 화면이 유지된 상태에서 Toast로 번호를 보려고 하는데이것이 안된다는 뜻이다.
문제 사례 2.화면을 유지하면서 번호를 볼수는 있지만스캐닝하는 화면을 기존의 화면에서 만들수 없다거나.(예를 들면 탭으로 구성된 내부 Fragment)
이런 어려움이 있는 개발자들이 많더라.
그래서 내가 선택한 방법은 barcodescanner 오픈소스(위 3개의 라이브러리 중 세번째)를 그대로 가지고 와서
프로젝트 내 모듈로 붙이는 것이다. (왓더)
그리고 내 입맛대로 고치기를 진행했다.
이를 위해 다음과 같은 과정을 거쳤다.
- 먼저 모듈을 만든다.
- 모듈에 barcodescanner 오픈소스를 담는다.
- 추가된 Zxing 모듈과 App 모듈의 dependencies 간에 중복된 부분은 App.gradle에서 제거한다.
- 위를 제거하지 않아서 나타나는 에러에 당황하지 않는다. (흑흑)
- CaptureManager 클래스를 수정한다.
- 기존의 CaptureManager 생성자는 정해진 Handler에 의해 작동하였다.
- 내 입맛대로 Handler를 사용하기 위해 Handler를 받는 생성자를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | // class CaptureManager // 기존 생성자 public CaptureManager(Activity activity, DecoratedBarcodeView barcodeView) { this.activity = activity; this.barcodeView = barcodeView; barcodeView.getBarcodeView().addStateListener(stateListener); handler = new Handler(); inactivityTimer = new InactivityTimer(activity, new Runnable() { @Override public void run() { Log.d(TAG, "Finishing due to inactivity"); finish(); } }); beepManager = new BeepManager(activity); } // 추가한 생성자 public CaptureManager(Activity activity, DecoratedBarcodeView barcodeView, Handler handler) { this.activity = activity; this.barcodeView = barcodeView; barcodeView.getBarcodeView().addStateListener(stateListener); this.handler = handler; inactivityTimer = new InactivityTimer(activity, new Runnable() { @Override public void run() { Log.d(TAG, "Finishing due to inactivity"); finish(); } }); beepManager = new BeepManager(activity); } public void decode(BarcodeCallback callback) { barcodeView.decodeSingle(callback); } // 코드 생략 // Callback을 자유롭게 사용하기 위해 아래와 같이 추가 // Fragment onResume에서 호출 public void decode(BarcodeCallback callback) { barcodeView.decodeSingle(callback); } // 스캔 후 화면이 닫히는 것을 막기 위해 private void finish() { // activity.finish(); } | cs |
참고자료
728x90
반응형
'Android, iOS' 카테고리의 다른 글
Dialog 테두리를 둥글게 하고 싶다. 엄청하고 싶다. (0) | 2018.09.27 |
---|---|
Edittext에 "-"(대쉬, Dash)가 들어간 포맷을 만들고 싶다면? (0) | 2018.09.27 |
Found data binding errors. import는 하셨습니까? (0) | 2018.08.10 |
버튼에서 본 애니메이션 효과. 나도 해보고 싶다. (0) | 2018.08.08 |
날짜 데이터를 String으로 받았다. Format은? Sorting은? (0) | 2018.08.06 |
Comment