IT_Programming/Android_Java

안드로이드 바코드 인식기(OCR) 오픈 소스 zxing 분석

JJun ™ 2013. 8. 5. 20:22


 출처:  http://blog.naver.com/wono77/140101427842

          http://blog.naver.com/wono77/140116510191


 

 

 

* 안드로이드 바코드 인식기(OCR) 오픈 소스 zxing 분석 (by wono77)

 

com.zip

 

안드로이드바코드인식기zxing1.5분석_bywono77_20100412.pdf

 

이미지인식스샷.jpg

 

 

 

최초문서작성: 2010년 2월 17일

수정: 2010년 2월 20일 테스트코드 import 방법 추가

           2010년 4월 13일 1.5버전의 프로젝트 생성 및 실행방법 pdf 설명 문서 추가

                               1.5버전에 누락된 R.java를 com.zip 압축 파일로 첨부 

         2010년 5월 10일  맥에서 아이폰 버전 테스트 해봄. 결과 설명

           2010년 9월 1일 테스트코드 수행 방법 스샷 추가

           2011년 1월 25일 zxing 코드 분석 및 자신만의 코드로 커스터마이징하기" 글 정리 및 공개 

                               http://blog.naver.com/wono77?Redirect=Log&logNo=140116510191

          2011년 9월 16일 zxing 1.7버전에서 바코드 인식후 인식결과를 네이버에 던지는 법 코드 공개

           2012년 3월 14일 zxing QRCode Reader 소개가 담긴 "안드로이드로 용돈벌기" 책 출간 소개

 

 

 

 

zxing 프로젝트 홈페이지: http://code.google.com/p/zxing/

zxing qrcode 생성기: http://zxing.appspot.com/generator/ 

 

zxing(Zebra Crossing  의미한다고 한다)는 안드로이드와 아이폰의 바코드 인식기 오픈소스(1D/2D 바코드 인코딩/디코딩)이다. 압축을 풀어보면 안드로이드 및 아이폰 소스가 공개되어 있다.

 

 

 

zxing에서 지원하는 바코드의 종류는 아래와 같다.

 

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 128
  • QR Code
  • Data Matrix ('alpha' quality)
  • PDF 417 ('alpha' quality)
  • ITF
  •  

     

     

    소스를 다운로드하자. 용량은 34메가(1.4버전) 정도 된다.

    http://code.google.com/p/zxing/downloads/list

    (20100412. 1.5 버전이 3월 4일에 새로 나왔네요. 계속 진화하고 있군요.^^;

    테스트해본 결과 1.5 버전은 아직 많이 불안정하네요.

    가능하면 1.4로 프로젝트 생성 및 테스트코드 프로젝트를 생성하세요.)

     

    블로그에서는 1.4 버전의 프로젝트와 테스트코드 프로젝트 환경셋팅 및 실행 방법을 설명하였다.

    첨부된 pdf 파일에서는 1.5 버전의 환경셋팅 및 실행 방법을 담았다.

     

    1.5버전은 테스트 코드 프로젝트 생성에 실패했다.

    (1.5버전에서 성공하신 분은 댓글로 설명해주시면 감사하겠습니다.^^)

     

     

     

    * zxing를 이클립스에서 사용하는 방법:

     

    (자바 개발 환경 셋팅은 되어 있고, 안드로이드 에뮬도 셋팅되어 있다는 가정에서 설명한다.)

     다운받은 파일의 압축을 해제한후, 안드로이드 최신 SDK에서 .\ZXing-1.4\android 폴더를

     import한다.

     

    - 안드로이드 에뮬셋팅(이클립스 셋팅방법포함)과 import 방법은 아래를 참조하자.

       안드로이드 에뮬시작하기:  http://blog.naver.com/wono77/140100847476    

       이클립스에서 안드로이드 프로젝트 import하기: 첨부된 pdf 파일 참고 

     

     

    import하면 빨간 x가 잔뜩 뜬다.

     

    신경쓰지 말고, 탐색기에서 .\ZXing-1.4\core\src 폴더를 열고 copy 한후,

    이클립스의 src 폴더에 paste한다.

     

    이 core 폴더에 binarization 과 같은 이미지 전처리를 하는 함수들이 존재한다.

    paste가 끝나면 빨간 x가 사라지고, 실행이 가능해진다.

     

    [zxing가 에뮬에서 실행된 모습]

     

     

     

    모바일 이미지 프로세싱 관련해서 자바 소스를 참고하기 매우 좋다.

     

     

     

    * 테스트코드 import하는 방법:

     

    zxing는 각 폴더마다 테스트코드가 따로 존재한다.

    이 중, core 폴더의 테스트 부분이 이미지처리를 위한 핵심부분인 듯 하다.

     

    그런데, 테스트를 위해서는 카메라로 사진을 찍어서 하는 것이 아니라, 특정 이미지를 로딩해서
    인식여부를 봐야 한다.
    이 때, import javax.imageio.ImageIO; 를 하는데,

    유감스럽게도 안드로이드 sdk는 java se에서 javax.imageio 부분을 지원하지 않는다.

    그래서, zxing의 테스트 코드는 따로 일반 자바 프로젝트를 생성해서 넣어줘야 한다.

     

    1) 자바 프로젝트 생성.

    2) src에 core폴더의 src하위 폴더를 copy해서 paste한다.

    3) test 폴더를 만들고, core 폴더의 test 하위에 있는 data(이미지존재)폴더와 test/src하위의
        폴더를 copy해서 paste한다.

     

    4) core/lib 폴더의 junit.jar를 외부 lib로 이클립스의 해당 프로젝트 환경설정에서 추가한다.

    5) 여전히 일분에서 빨간 x가 뜬다. java se의 일부 소스를 넣어줘야 한다.

     

    압축 풀었던 폴더에서 .\ZXing-1.4\javase\src 의 하위 폴더를 paste 해주면 된다.

     

     

    zxing가 eclipse에 import된 화면(위)과 core의 테스트코드로 프로젝트 생성한 화면(아래)

     

    - 테스트할 파일 위에 마우스 커서를 얹고 JUnit Test 수행

     

     

     

    - 안드로이드는 Android JUnit Test Launcher를 수행해야함 

     

     

     

    [Junit 테스트 성공한 모습]

     

     

     

     

    이제 카메라가 없더라도 Test코드에서 마음껏 이미지를 테스트하면서, 소스를 변경해보자.^^

     

     

     

    * zxing 소스 분석: (분석중)

     

    대충 살펴보니 카메라로 autofocusing 하면서 이미지를 decoding 하는 듯 하다.

    내가 참고할 부분은 카메라 제어와 byte 단위로 변환해주는 이미지 decoder 부분.

    카메라로 찍다가 autofocusing되면, CaptureActivityHandler.java의 DecodeThread 에서

    안드로이드의 SharedPreferences 클래스로 디코딩되고, 결국은 DecodeThread.java의 run()에 있는 decode() 함수를 호출하게 된다. 차근차근 정리하면서 기초부터 구현해나가도록 하겠다.

     

     

    - 20100221 일요일:

    Test코드에서 binarization 호출흐름 파악중

    QRCodeWriterTestCase.java 로 binarization의 흐름이 파악 가능하다. 
    파일 내의 주요 함수: compareToGoldenFile datamatrix -> DataMatrixBlackBox1TestCase -> new DataMatrixReader에서 BitmapBinarize호출을 하면서 실질적인 Binarizer를 호출하게 된다..

     

    (의문) 훈련기와 인식기는 어디에 있을까? 모델파일은 어디에 있을까..

     

    * Junit 수행시, data 폴더 안의 이미지들 인식하는 모습 스샷(파일로도 따로 첨부함)

     

     

    - 20100510 월요일:

    맥북 프로를 샀어요. 아이폰은 있구요..

    아이폰에서는 zxing이 어떻게 동작될지 궁금해서, 맥북에서 zxing 1.4를 다운 받은후,

    아이폰 폴더에서 있는 zxing를 xcode에서 open했어요.

    zxing에 설정된 시뮬레이터가 처음에는 ver 2.x 라서 그것만 바꾸고, 실행하니

     안드로이드에서 했던 지저분한 재설정이 필요없이

    아이폰 시뮬레이터에 zxing 화면이 바로 떠버리네요; 허탈.

    인증 샷은 제가 아직 맥북 사용에 익숙치 않아 스샷을 못 떴어요.

    zxing은 아이폰에 더 최적화 되어 있나봅니다.

    조만간 아이폰과 안드로이드 폰에 직접 올려보고 공유드릴께요.

    아직 개발자 유료 등록을 안해서...

     

     

    - 20100511 화요일:

    안드로이드폰 HTC 디자이어를 주문했어요.

    금요일에 개통되고 토요일에는 올거 같은데, 폰이 오면 zxing를 안드로이드 폰에 한번 올려볼께요.^-^

     

     

    - 20100615 화요일:

    안드로이드폰 HTC 디자이어에서 잘 작동되는 것을 확인하였습니다.

    아이폰은 개발자 유료등록을 안해서 확인못했습니다.^-^

     

     

    - 201010

    zxing으로 안드로이드 qrcode 인식기 외주 개발

     

     

    - 20110125 화요일:

    "zxing 코드 분석 및 자신만의 코드로 커스터마이징하기" 글 정리 및 공개 

    http://blog.naver.com/wono77?Redirect=Log&logNo=140116510191

     

     

    - 20110916 금요일:

    zxing 1.7버전에서 바코드 인식후 인식결과를 네이버에 던지는 코드를 공개합니다.

    1.7역시 1.4와 비교했을때 인식결과를 다루는 부분은 크게 바뀌지는 않았습니다.

    아래처럼 해주시면 됩니다.

     

    CaptureActivity.java에서 handleDecodeInternally함수를 아래처럼 변경해주세요.

    Web.class는 제가 간단히 만든 단순한 웹뷰 클래스입니다.

    아래 함수에서 추가하실 부분은 빨간색, 주석다실 부분은 파란색입니다.

     

     

      Intent intent = null;

     

    // Put up our own UI for how to handle the decoded contents.
      private void handleDecodeInternally(Result rawResult, ResultHandler resultHandler, Bitmap barcode) {
        statusView.setVisibility(View.GONE);
        viewfinderView.setVisibility(View.GONE);
        resultView.setVisibility(View.VISIBLE);

        ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view);
        if (barcode == null) {
          barcodeImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),
              R.drawable.launcher_icon));
        } else {
          barcodeImageView.setImageBitmap(barcode);
        }

        TextView formatTextView = (TextView) findViewById(R.id.format_text_view);
        formatTextView.setText(rawResult.getBarcodeFormat().toString());

        TextView typeTextView = (TextView) findViewById(R.id.type_text_view);
        typeTextView.setText(resultHandler.getType().toString());

        DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
        String formattedTime = formatter.format(new Date(rawResult.getTimestamp()));
        TextView timeTextView = (TextView) findViewById(R.id.time_text_view);
        timeTextView.setText(formattedTime);


        TextView metaTextView = (TextView) findViewById(R.id.meta_text_view);
        View metaTextViewLabel = findViewById(R.id.meta_text_view_label);
        metaTextView.setVisibility(View.GONE);
        metaTextViewLabel.setVisibility(View.GONE);
        Map<ResultMetadataType,Object> metadata =
            (Map<ResultMetadataType,Object>) rawResult.getResultMetadata();
        if (metadata != null) {
          StringBuilder metadataText = new StringBuilder(20);
          for (Map.Entry<ResultMetadataType,Object> entry : metadata.entrySet()) {
            if (DISPLAYABLE_METADATA_TYPES.contains(entry.getKey())) {
              metadataText.append(entry.getValue()).append('\n');
            }
          }
          if (metadataText.length() > 0) {
            metadataText.setLength(metadataText.length() - 1);
            metaTextView.setText(metadataText);
            metaTextView.setVisibility(View.VISIBLE);
            metaTextViewLabel.setVisibility(View.VISIBLE);
          }
        }

        TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view);
      
        CharSequence displayContents = resultHandler.getDisplayContents();
        contentsTextView.setText(displayContents); //<- 여기서 displaycontents 가 인식결과.
       
     intent = new Intent(getApplicationContext(), Web.class);
     intent.putExtra("target", "http://search.naver.com/search.naver?where=nexearch&query="+displayContents+"&sm=top_hty&fbm=1&ie=utf8");
     startActivity(intent);
       
    //    // Crudely scale betweeen 22 and 32 -- bigger font for shorter text
    //    int scaledSize = Math.max(22, 32 - displayContents.length() / 4);
    //    contentsTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, scaledSize);
    //
    //    TextView supplementTextView = (TextView) findViewById(R.id.contents_supplement_text_view);
    //    supplementTextView.setText("");
    //    supplementTextView.setOnClickListener(null);
    //    if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
    //        PreferencesActivity.KEY_SUPPLEMENTAL, true)) {
    //      SupplementalInfoRetriever.maybeInvokeRetrieval(supplementTextView, resultHandler.getResult(),
    //          handler, this);
    //    }

    //    int buttonCount = resultHandler.getButtonCount();
    //    ViewGroup buttonView = (ViewGroup) findViewById(R.id.result_button_view);
    //    buttonView.requestFocus();
    //    for (int x = 0; x < ResultHandler.MAX_BUTTON_COUNT; x++) {
    //      TextView button = (TextView) buttonView.getChildAt(x);
    //      if (x < buttonCount) {
    //        button.setVisibility(View.VISIBLE);
    //        button.setText(resultHandler.getButtonText(x));
    //        button.setOnClickListener(new ResultButtonListener(resultHandler, x));
    //      } else {
    //        button.setVisibility(View.GONE);
    //      }
    //    }
    //
    //    if (copyToClipboard && !resultHandler.areContentsSecure()) {
    //      ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    //      clipboard.setText(displayContents);
    //    }
       
      } 

     

    - 20120314 수요일:

    제가 쓴 "안드로이드로 용돈벌기" 책이 출간되었습니다.^^

    블로그에 실은 Zxing QRCode Reader 관련 내용과

    이클립스에서 바로 실행가능하도록 묶은 소스, 

    네이버로 인식결과를 던지는 커스트마이징 소스도 담고 있습니다.

     

    - 20130425

    현재 zxing 소스가 2.1까지 나왔군요.

    용돈벌기 현재 책엔 1.7을 다루었는데요,

    2.1이 안된다는 제보가 있어서,

    테스트해보면 글 올리겠습니다.

     

     

     

     


     

     

     

     

     

    zxing 코드 분석 및 자신만의 코드로 커스터마이징하기(by wono77)

     

     

    인식결과를네이버로보내는소스.zip

     

     

     

     

    2010년 10월 17일: 비공개 글작성시작

    2011년 1월 25일: 글 내용 추가 및 공개로 변경

    2012년 1월 28일:

          - 커스터마이징 후, 인식결과를 네이버 검색엔진에 던지는 소스 파일을 글에 첨부 

           - 본문 스크랩 허용으로 변경

     

     

     

    안녕하세요, 하얀별입니다.

     

    qrcode 인식기 오픈소스 zxing을 입맛에 맞게 수정해보도록 하겠습니다.

     

    이 강좌를 찾는 사람들은 아마 zxing이라는 오픈 소스를 변경해서 자신만의 안드로이드 앱을

    만드려는 분들일 것입니다.

     

     

    zxing의 컴파일 방법은 앞서서 http://blog.naver.com/wono77?Redirect=Log&logNo=140101427842 의 강좌에서 살펴보았습니다.

     

     

     

    - 기존의 zxing과 같게 인식된다?

     

    zxing을 조금 고쳐서 마켓에서 이미 zxing(바코드 스캐너 by zxing team과 겹침) 을 받은 핸드폰에 apk 파일을 설치해보면, 기존의 마켓에서 받은 zxing과 자신이 고친 zxing을 같은 프로그램으로

    인식한다는 것을 알수있습니다. zxing을 고쳐서 다른 프로그램으로 포장한 후 마켓에 배포해야할텐데, 원작자의 것과 같은 프로그램으로 인식한다니 어떻게 해야할까요.

     

    같은 이름의 패키지면 안드로이드 마켓은 같은 프로그램으로 인식하게 됩니다.

    그래서 패키지를 수정해야 합니다.

     

    zxing 패키지를 변경하는 방법을 정리해 보았습니다.

     

    미션: com.google.zxing -> com.google.zxing1 으로 간단히 변경해봅시다.

     

    1. menifest의 패키지명을 변경합니다.

    2. 실제 src 하단에서 f2를 눌러 이클립스의 리팩토링기능으로 패키지명을 변경합니다.

         1) 이 때 뜨는 체크박스에서 2번째 체크를 on해서 서브패키지명도 모두 변경합니다.

             ..여기서 빨간 액박이 사라진다고 그냥 컴파일해서 실행하면 에뮬이 죽습니다.

     

    3. capture.xml의 26라인에서..아래의 패키지를 자신이 바꾼 모양으로 변경  

        <com.google.zxing1.client.android.ViewfinderView 

     

    4. src/com.google.zxing1/client/android/CaptureActivity.java의

        89라인의 패키지명을 변경

        private static final String PACKAGE_NAME = "com.google.zxing1.client.android";

        + src/com.google.zxing1/intents.java 이 파일에 define된 고칠 부분 많음.

        4개정도 public static final String ACTION = "com.google.zxing1.client.android.ENCODE"; 

        등등..

     

     

     

    - zxing 인식후 url 분석 결과 화면부분 수정

    : zxing은 코드의 양이 어마어마합니다.

    : 이 많은 코드들 중 인식된 결과 값을 자신이 원하는 화면으로 보내려면 어디를 고쳐야할까요.

    : 가장 중요한 부분이며, 저도 그랬고 zxing을 연구하는 모든 사람들이 알고 싶을 부분일 것입니다.

     

    주저리 주저리 정리도 안되게 떠들었지만, 가장 중요한 부분은 여기 한군데 이므로

    잠깐 집중 부탁드립니다.. CaptureActivity.java의 handleDecodeInternally() 함수를 찾아주세요.

    함수안에서 기능 설명을 달아보았습니다.

     

     

     

     // Put up our own UI for how to handle the decoded contents.
     private void handleDecodeInternally(Result rawResult, Bitmap barcode) throws Exception
     {

           statusView.setVisibility(View.GONE); // 레이어에 빨간줄 노출 여부 결정
           viewfinderView.setVisibility(View.GONE);
           resultView.setVisibility(View.VISIBLE);

      

           // 인식결과 이미지 출력
           if (barcode == null) {
                 barcode = ((BitmapDrawable) getResources().getDrawable

                                            (R.drawable.unknown_barcode)).getBitmap();
           }
      

           ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view);
           barcodeImageView.setVisibility(View.VISIBLE);
           barcodeImageView.setMaxWidth(MAX_RESULT_IMAGE_SIZE);
           barcodeImageView.setMaxHeight(MAX_RESULT_IMAGE_SIZE);
           barcodeImageView.setImageBitmap(barcode);

     

          // 인식결과 포맷출력
          TextView formatTextView = (TextView) findViewById(R.id.format_text_view);
           formatTextView.setVisibility(View.VISIBLE);
           formatTextView.setText(getString(R.string.msg_default_format) + ": " +     

                                                      rawResult.getBarcodeFormat().toString());

          // 인식결과 type 출력
           ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this,

                                                                 rawResult);
           TextView typeTextView = (TextView) findViewById(R.id.type_text_view);

           // typeTextView.setText(getString(R.string.msg_default_type) + ": "
                        + resultHandler.getType().toString());//

           //

           // 이미지 오른쪽에 "FOUND URL", "http://...." 출력하는 부분
           // styled가 출력되는 최종값임.
           TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view);
           CharSequence title = getString(resultHandler.getDisplayTitle());
           SpannableStringBuilder styled = new SpannableStringBuilder(title + "\n\n"); 
           // 2줄띄우고
      

          styled.setSpan(new UnderlineSpan(), 0, title.length(), 0);
          CharSequence displayContents = resultHandler.getDisplayContents();
          styled.append(displayContents);


           // todo: 여기서 부터 자신의 코딩을 해주시면 됩니다.
          contentsTextView.setText(styled); //화면에 인식결과 표시 ********(중요)

     

          // 화면에 qrcode의 인식결과가 출력되는 부분이 바로 여기입니다.

          // 화면에 인식결과만 출력된다면 주로 인식결과가 url이므로

          // webkit에 intent로 던지면 되겠지요?

          // zxing은 url뿐 아니라 map, 전화번호 여러가지를 처리하므로

          // resultHandler에 타입을 던져 결정짓고(위에서 보신 코드)

          // 값을 던집니다.
          int buttonCount = resultHandler.getButtonCount();
          ViewGroup buttonView = (ViewGroup) findViewById(R.id.result_button_view);
          buttonView.requestFocus();
          for (int x = 0; x < ResultHandler.MAX_BUTTON_COUNT; x++) {
                 TextView button = (TextView) buttonView.getChildAt(x);
                 if (x < buttonCount) {
                      button.setVisibility(View.VISIBLE);
                      button.setText(resultHandler.getButtonText(x));
                      button.setOnClickListener(new ResultButtonListener(resultHandler, x));
                 } else {
                      button.setVisibility(View.GONE);
                 }
         }
      
         if (copyToClipboard) {
                 ClipboardManager clipboard = (ClipboardManager) getSystemService

                                                                     (CLIPBOARD_SERVICE);
                 clipboard.setText(displayContents);
         }


     }

     

     

     

     

    - zxing 첫화면의 help 장면 없애기

    onCreate()메소드에서 맨 마지막의 showHelpOnFirstLaunch()을 주석처리 ( by 영등포할렘님 )

      

     

    - zxing 메뉴 없애기

    메뉴키 눌렀을때 나오는 부분들을 없애고 싶다면, 아래 라인들의 3개 함수를 모두 주석 달아 주어야 합니다.

     

     

    //메뉴를 실제적으로 뿌려주는 부분
    // 이부분을 기초로해서 onOptionsItemSelected가 동작  
    //  @Override
    //  public boolean onCreateOptionsMenu(Menu menu) {
    //    super.onCreateOptionsMenu(menu);
    //    menu.add(0, SHARE_ID, 0, R.string.menu_share).setIcon(R.drawable.share_menu_item);
    //    menu.add(0, HISTORY_ID, 0, R.string.menu_history)
    //        .setIcon(android.R.drawable.ic_menu_recent_history);
    //    menu.add(0, SETTINGS_ID, 0, R.string.menu_settings)
    //        .setIcon(android.R.drawable.ic_menu_preferences);
    //    menu.add(0, HELP_ID, 0, R.string.menu_help)
    //        .setIcon(android.R.drawable.ic_menu_help);
    //    menu.add(0, ABOUT_ID, 0, R.string.menu_about)
    //        .setIcon(android.R.drawable.ic_menu_info_details);
    //    return true;
    //  }

      // Don't display the share menu item if the result overlay is showing.
    //  @Override
    //  public boolean onPrepareOptionsMenu(Menu menu) {
    //    super.onPrepareOptionsMenu(menu);
    //    menu.findItem(SHARE_ID).setVisible(lastResult == null);
    //    return true;
    //  }

    //메뉴 버튼 누를때의 옵션 버튼들.
    //메뉴버튼 옵션 기능도 걷어내자
    //  @Override
    //  public boolean onOptionsItemSelected(MenuItem item) {
    //    switch (item.getItemId()) {
    //      case SHARE_ID: {
    //        Intent intent = new Intent(Intent.ACTION_VIEW);
    //        intent.setClassName(this, ShareActivity.class.getName());
    //        startActivity(intent);
    //        break;
    //      }
    //      case HISTORY_ID: {
    //        AlertDialog historyAlert = historyManager.buildAlert();
    //        historyAlert.show();
    //        break;
    //      }
    //      case SETTINGS_ID: {
    //        Intent intent = new Intent(Intent.ACTION_VIEW);
    //        intent.setClassName(this, PreferencesActivity.class.getName());
    //        startActivity(intent);
    //        break;
    //      }
    //      case HELP_ID: {
    //        Intent intent = new Intent(Intent.ACTION_VIEW);
    //        intent.setClassName(this, HelpActivity.class.getName());
    //        startActivity(intent);
    //        break;
    //      }
    //      case ABOUT_ID:
    //        AlertDialog.Builder builder = new AlertDialog.Builder(this);
    //        builder.setTitle(getString(R.string.title_about) + versionName);
    //        builder.setMessage(getString(R.string.msg_about) + "\n\n" + getString(R.string.zxing_url));
    //        builder.setIcon(R.drawable.zxing_icon);
    //        builder.setPositiveButton(R.string.button_open_browser, aboutListener);
    //        builder.setNegativeButton(R.string.button_cancel, null);
    //        builder.show();
    //        break;
    //    }
    //    return super.onOptionsItemSelected(item);
    //  }
     

     

     

    * 이 글의 첨부파일로, 상품 바코드 인식후, 네이버 검색엔진에 바코드 인식결과를 던지는 예제를

       첨부해두었습니다. Zxing을 공부하시는 분들께 많은 도움이 되었으면 합니다. ^^ 

     

     

     

    이미지인식스샷.jpg
    0.15MB
    com.zip
    0.0MB
    인식결과를네이버로보내는소스.zip
    1.98MB
    안드로이드바코드인식기zxing1.5분석_bywono77_20100412.pdf
    1.18MB