'바코드스캐너'에 해당되는 글 1건

  1. 2015.01.27 ZXing을 이용해 안드로이드 폰에서 바코드, QR코드 인식하기 (3)
Android2015. 1. 27. 20:40

어플에 바코드나 QR코드 인식 기능을 넣는 방법엔 두가지가 있습니다. 첫번째는 intent로 바코드 인식 기능이 있는 앱(ex.바코드리더기)을 실행시킨 후 결과를 받는거구요, 두번째는 아예 앱 자체에 바코드 인식 기능을 넣어버리는 겁니다.


첫번째 방법은 구현하기 매우 간단하지만 바코드리더기 앱이 없고 인터넷이 안되는 상황이라면 만든 앱이 정상작동을 안하겠죠..


두번째는 라이브러리 구해서 추가하고 매니패스트 수정하고 등등 할게 많지만 독립적으로 운용 가능한 앱을 만들 수 있다는 장점이 있습니다.


이번 포스팅에서는 두번째 방법에 대해 간단히 설명하려 합니다. 자세한 설명은 밑의 출처 링크를 클릭해서 보시구요. 저는 겪은 시행착오에 대해 언급하겠습니다.


먼저, 출처에 소스코드가 있지만 혹시나 해서 여기에도 올리겠습니다.


zxing_exam.zip


먼저 만들어진 앱에 이 부분만 붙이신다면 우선 core.jar를 옮겨야 하구요.


com.google.zxing.client.android

com.google.zxing.client.android.camera

com.google.zxing.client.android.integration

com.google.zxing.client.android.result


그리고 이 네개의 패키지를 모두 옮겨야 사용 가능합니다.


물론 매니페스트나 xml파일은 위 패키지들 안의 소스에 맞게 수정하고 옮기셔야 작동하겠죠


이렇게 해서 바코드 스캐너 기능을 가진 앱을 만들 수 있는데, 약간 꺼림칙한 부분이 있어요. 단말기에 바코드 스캐너 앱이 여러개 설치되어있는 경우, 어떤걸 열건지 물어보는 창이 뜨게되는데 아마 intent 이름이 같아서 선택하라고 뜨는것 같습니다. 우리는 앱 내부에 있는 클래스(CaptureActivity)를 열기 때문에 다른 앱은 필요가 없죠. 이걸 없애는 방법은 다음과 같습니다.


IntentIntegrator 클래스에서

Intent intentScan = new Intent("com.google.zxing.client.android.SCAN"); 부분을

Intent intentScan = new Intent(activity, CaptureActivity.class); 로 바꾸고


CaptureActivity클래스에서

if (intent != null && action != null) 부분의 else 부분에 

source = Source.NONE;

decodeFormats = null;

characterSet = null;

가 있는데 이걸

Source.NATIVE_APP_INTENT;
decodeFormats = DecodeFormatManager.parseDecodeFormats(intent);
characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);

로 바꾸면 됩니다.


여러군데 흩어져 있는 정보를 짜깁기해서 만든 포스팅이라 좀 혼잡하네요.. 



출처 - http://theeye.pe.kr/archives/1339








Posted by 너를위한노래

댓글을 달아 주세요

  1. ky

    안녕하세요 지나가는 하수 ky라고 합니다.

    QR코드에 대한 정보를 잘 봤습니다.

    올려주신 소스를 다운받아 import시켜 실행한 결과 잘 됩니다.

    하지만 자체 내부의 바코드 기능인식을 넣는 부분이 잘 되지 않아 이렇게 글을 남깁니다.

    위에 말씀하신대로, IntentIntegrator 클래스에서
    Intent intentScan = new Intent("com.google.zxing.client.android.SCAN"); 부분을
    Intent intentScan = new Intent(activity, CaptureActivity.class); 로 바꾸고

    CaptureActivity클래스에서
    if (intent != null && action != null) 부분의 else 부분에
    source = Source.NONE;
    decodeFormats = null;
    characterSet = null;
    가 있는데 이걸
    Source.NATIVE_APP_INTENT;
    decodeFormats = DecodeFormatManager.parseDecodeFormats(intent);
    characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);

    로 변경하였으나, 실행이 되지 않습니다.

    참고로 Source.NATIVE_APP_INTENT; 부분이 오류가 나서 source = Source.NATIVE_APP_INTENT;로 변경하여 돌렸습니다.

    로그는 다음과 같습니다.

    09-09 09:38:42.660: E/AndroidRuntime(31711): FATAL EXCEPTION: main
    09-09 09:38:42.660: E/AndroidRuntime(31711): Process: kr.pe.theeye.qrcode, PID: 31711
    09-09 09:38:42.660: E/AndroidRuntime(31711): java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType
    09-09 09:38:42.660: E/AndroidRuntime(31711): at com.google.zxing.client.android.CaptureActivity.<clinit>(CaptureActivity.java:70)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at java.lang.Class.newInstanceImpl(Native Method)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at java.lang.Class.newInstance(Class.java:1208)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2142)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2275)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.app.ActivityThread.access$800(ActivityThread.java:142)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1220)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.os.Handler.dispatchMessage(Handler.java:102)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.os.Looper.loop(Looper.java:136)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at android.app.ActivityThread.main(ActivityThread.java:5091)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at java.lang.reflect.Method.invokeNative(Native Method)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at java.lang.reflect.Method.invoke(Method.java:515)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    09-09 09:38:42.660: E/AndroidRuntime(31711): at dalvik.system.NativeStart.main(Native Method)

    답변해 주시면 정말 감사하겠습니다.

    그럼 오늘도 좋은 하루 되세요.

    2015.09.09 09:41 [ ADDR : EDIT/ DEL : REPLY ]
    • sss

      저도 똑같이 오류 나는데 혹시 해결 하셨나요?ㅠㅠ

      2015.12.02 11:15 [ ADDR : EDIT/ DEL ]
    • 나그네

      안녕하세요. 지나가는 나그네입니다.
      정의안된클래스다. 라는 에러가 있네요.
      메니페스트에 액티비티로 등록안하셔서 발생하는 에러인것 같네요.

      2016.01.18 09:32 [ ADDR : EDIT/ DEL ]