Tag Archives: Barcode

[QR코드리더] ZXing을 이용하여 내 안드로이드 어플에 QR코드 스캐너 도입하기

[ZXING]이라는 정말 잘 만들어진 안드로이드에서도 사용할 수 있는 QR코드/바코드 스캐너가 있습니다. 아이폰에서는 적당히 자유롭게 쓸 수 있지만 안드로이드에서는 Intent라는 좋은(?) 개념때문인지 Barcode Scanner라는 프로그램을 설치하여 그것을 Intent로 호출해 사용하게끔 하고 있더군요.

그리하여 ZXing의 안드로이드 소스를 커스터마이징 해서 그냥 사용할 수 있도록 약간 고쳐보았습니다. 만들어진 소스는 ZXing android + android-integration을 통합하여 제작하였습니다.

사용하시는 방법은 소스코드를 그냥 통채로 올리니 참고하시면 되겟지만 간단하게 기록을 해보겠습니다.

1. AndroidManifest.xml에 다음을 추가합니다.

[code]<activity
  android:name=”com.google.zxing.client.android.CaptureActivity”
  android:screenOrientation=”landscape”
  android:configChanges=”orientation|keyboardHidden”
  android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”
  android:windowSoftInputMode=”stateAlwaysHidden”>
    <intent-filter>
      <action android:name=”com.google.zxing.client.android.SCAN”/>
      <category android:name=”android.intent.category.DEFAULT”/>
    </intent-filter>
</activity>

<uses-feature android:name=”android.hardware.camera”/>
<uses-permission android:name=”android.permission.CAMERA”/>
<uses-permission android:name=”android.permission.INTERNET”/>
<uses-permission android:name=”android.permission.FLASHLIGHT”/>
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>[/code]

2. 리소스 파일을 복사합니다. UI를 변경하고 싶을 경우 capture.xml을 변경하시면 됩니다.

res/layout/capture.xml
res/layout/ids.xml

3. 스캐너 호출 방법 (android-integration)

[code]// QR코드/바코드 스캐너를 구동합니다.
IntentIntegrator.initiateScan(MainActivity.this);[/code]

4. 결과 처리 방법

[code]protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
  // QR코드/바코드를 스캔한 결과 값을 가져옵니다.
  IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);

  // 결과값 출력
  new AlertDialog.Builder(this)
  .setTitle(R.string.app_name)
  .setMessage(result.getContents() + ” [” + result.getFormatName() + “]”)
  .setPositiveButton(“확인”, new DialogInterface.OnClickListener()
  {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
      dialog.dismiss();
    }
  })
  .show();
}[/code]

1394066880.zip

[iPhone/QR Code] XZing QR코드 리더 사용하기

QR코드 리더를 구현하기 위해 이리저리 알아보던중에 정말 멋지다 못해 거의 완벽한 라이브러리를 발견하였습니다. XZing이라는 것인데요. 다음과 같이 다양한 바코드를 읽을 수 있습니다.


UPC-A and UPC-E
EAN-8 and EAN-13
Code 39
Code 93
Code 128
QR Code
ITF
Codabar
RSS-14 (all variants)
Data Matrix
PDF 417 (‘alpha’ quality)

또한 이 라이브러리의 강점은 정말 다양한 플랫폼에서 동일하게 동작한다는 것인데요, 다음과 같은 다양한 언어/OS에서 동작할 수 있습니다.


javame: JavaME client
csharp: Partial C# port
cpp: Partial C++ port
rim: RIM/Blackberry-specific client build
iphone: iPhone client + port to Objective C / C++ (QR code only)
bug: Client for BugLabs’s BUG
jruby: Ruby wrapper
actionscript: partial port to Actionscript


정말 안되는게 없네요. 하지만 우선 아이폰 기반에서 어떻게 사용하는지에 대해 적어보도록 하겠습니다. 중요한 소스코드는 iphone/안에 모두 모여있습니다. iphone/ZXingWidget/프로젝트가 범용적으로 사용할 수 있는 뷰컨트롤러 형태의 라이브러리 프로젝트입니다. 이것을 실제로 사용한 샘플을 제작해 둔 것이 iphone/ScanTest/입니다. ScanTest를 면밀히 분석해 보면 어떻게 ZXingWidget라이브러리를 사용하는지 알 수 있지만 과정을 적어보도록 하겠습니다.

결과적으로 마지막에는 ScanTest소스를 보여드리겠지만 ZXingWidget프로젝트를 가지고 내가 새로운 프로젝트를 생성하여 개발한다고 가정해 보겠습니다.

1. ZXingWidget 디렉토리 안에 있는 ZXingWidget.xcodeproj 파일을 새로운 프로젝트의 Groups and Files 사이드바로 드래그하여 넣어줍니다. 이때에 파일을 복사할꺼냐고 물어보는데 복사는 하지 않습니다. Reference TypeRelative to Project로 선택해 줍니다.

사용자 삽입 이미지
2. 추가한 파일을 선택(1)하면 오른쪽에 libZXingWidget.a 파일이 리스팅됩니다. 그 옆(2)에 체크해 줍니다.

사용자 삽입 이미지3. 이제 Targets(1)이하의 프로젝트를 선택하여 Info(2)를 눌러 설정으로 들어갑니다.

사용자 삽입 이미지
4. General(1)탭안의 Direct Dependencies+(2)를 눌러 ZXingWidget(3)을 추가해 줍니다.

사용자 삽입 이미지
5. 이제 프로젝트의 설정창에 들어가 Header Search Paths(3)설정을 찾아 ZXingWidget라이브러리 프로젝트 안의 Classes의 상대 경로(5)를 추가해줍니다. 이때에 Recursive에 체크를 하셔야 합니다.

6. 이제 설정은 모두 끝났습니다. 다음의 헤더 파일이 핵심이 됨을 잊지 마세요.

[code]#import “ZXingWidgetController.h” // QR코드 리더 뷰 컨트롤러
#import “QRCodeReader.h” // QR코드 파싱을 위한 리더 등록용[/code]
7. 마지막으로 ScanTest 프로젝트의 샘플 코드를 잠깐 보겠습니다.

[code]- (IBAction)scanPressed:(id)sender
{
  // QR코드 리더 전용 뷰 컨트롤러 생성
  ZXingWidgetController *widController =
  [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];

  // QR코드 분석기 생성
  QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
  NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];
  [qrcodeReader release];
  widController.readers = readers;
  [readers release];

  // 인식 성공시에 플레이될 음악
  NSBundle *mainBundle = [NSBundle mainBundle];
  widController.soundToPlay =
  [NSURL fileURLWithPath:
    [mainBundle pathForResource:@”beep-beep” ofType:@”aiff”] isDirectory:NO];

  // 뷰를 보여준다
  [self presentModalViewController:widController animated:YES];
  [widController release];
}


#pragma mark –
#pragma mark ZXingDelegateMethods


– (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result {
  // 정상적으로 QR코드를 읽었을때 – 해독된 문자열이 result에 담겨있다.
  self.resultsToDisplay = result;
  if (self.isViewLoaded)
  {
    [resultsView setText:resultsToDisplay];
    [resultsView setNeedsDisplay];
  }
  [self dismissModalViewControllerAnimated:NO];
}


– (void)zxingControllerDidCancel:(ZXingWidgetController*)controller
{
  // 사용자가 취소했을 경우
  [self dismissModalViewControllerAnimated:YES];
}[/code]


참고로 ZXingWidget 라이브러리의 BaseSDK가 정상적으로 설정이 되어있다면 ScanTest에서 정상적으로 빌드가 될 때 ZXingWidget의 Product 폴더에 .a파일이 생성됨을 볼 수 있습니다. 이 파일만을 복사해다가 프로젝트안에 추가하면 위의 복잡한 설정없이 바로 사용 가능합니다.