Java/Android

바코드 인식기 만들기

체리필터 2015. 5. 13. 16:15
728x90
반응형

급하게 바코드 인식 관련 프로그램을 만들다 보니 오픈소스를 검색하게 되었고 Google에서 제작한 zxing 이란 것을 발견하게 되었습니다. (GitHub : https://github.com/zxing/zxing)

해당 코드와 관련된 포스팅들이 여럿 나왔지만 다 조금 씩 부족한 부분들이 있어서 정리 차원에서 올립니다.

물론 제가 올린 내용도 부족한 부분이 많습니다.

 

1. 외부 앱을 이용한 방법

 

이미 외부 앱을 이용해서 구동하는 방법은 잘 정리된 곳이 있습니다.

관련 포스팅은 http://code.tutsplus.com/tutorials/android-sdk-create-a-barcode-reader--mobile-17162 를 참고하시면 됩니다.

간단하게 정리하자면 Github에서 다운로드 받은 소스 중에 IntentIntegrator.java와 IntentResult.java 두개의 파일만 사용하는 것입니다.
특정 Button의 onClick Event에서 아래 내용을 호출할 수 있도록 하면 됩니다.

IntentIntegrator scanIntegrator = new IntentIntegrator(MainActivity.this);
scanIntegrator.initiateScan();

그러면 onActivityResult에서 특정 앱에서 Scan한 값을 받게 됩니다.
리턴 받게 된 값은 아래와 같은 형식으로 받으면 됩니다.

 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
	super.onActivityResult(requestCode, resultCode, data);

	if(resultCode == RESULT_OK) {
		IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
		if(scanningResult != null) {
			String scanContent = scanningResult.getContents();
			String scanFormat = scanningResult.getFormatName();
		} else {
			// error
		}
	}
}


이렇게 하는 방법은 매우 쉽지만 외부 앱을 추가로 깔아야 한다는 단점이 있습니다.

자체적으로 카메라를 구동 시키고 바코드나 QR코드를 인식할 수 있다면 좋겠다는 생각에 다른 방법을 찾아 보았습니다.

조금 무식하지만 필요한 소스 코드를 다 포함하고, 자체적으로 구동하는 것이죠.

 

2. 자체 구현

 

사실 소스 코드 크기가 좀 되기에 자체 구현하기가 망설여 졌지만 일단 구현하였습니다.

자체 구현 관련되어서 참고한 사이트는 http://fishbear.tistory.com/3 입니다.

그런데 ant로 core.jar 파일을 만들어야 한다는데... build.xml 파일이 없더라는 ㅠㅠ

그래서 더 찾아보니 zxing의 특정 버전부터 maven으로 바뀌었다고 하네요.

그래서 maven으로 jar 파일을 만들었지만... 호출해야 하는 Activity인 CaptureActivity 가 해당 jar 파일 안에 없더군요 ^^;;

어쩔 수 없이 해당 소스코드를 다 lib 프로젝트에 포함 시켰습니다.

이로 인해 생기는 Resource 관련 오류들을 fix하기 위해 zxing 안에 있는 res 파일들을 포함 시켰구요 ㅠㅠ

어째든 에러가 없도록 만든 다음... 다음과 같이 사용을 하면 됩니다.(fq는 AQuery 인스턴스입니다. AQuery를 사용 안하시는 경우는 native로 구현 하세요.)

fq.find(R.id.btn_read_barcode).clicked(new OnClickListener() {
	@Override
	public void onClick(View arg0) {
		Intent intent = new Intent("com.google.zxing.client.android.SCAN");
		startActivityForResult(intent, 49374);
	}
});


하지만 이렇게 하게 될 경우 SCAN이란 Activity가 없다는 에러가 발생합니다.

따라서 Manifest 파일에 다음과 같이 정의를 해 줘야 합니다.

<activity
	android:name="com.google.zxing.client.android.CaptureActivity"
	android:configChanges="orientation|keyboardHidden"
	android:screenOrientation="landscape"
	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>

이렇게 하게 되면 성공적으로 바코드 인식 프로그램이 내부적으로 뜨게 됩니다.
그리고 바코드 인식 후 onActivityResult에서 다음처럼 받아 사용하면 됩니다.

 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	super.onActivityResult(requestCode, resultCode, data);

	if(requestCode == 49374) {
		if(resultCode == RESULT_OK) {
			String scanContent = data.getStringExtra("SCAN_RESULT");
		} else {
			// error
		}
	}
}


49374란 숫자는 intent를 띄울 때 넘어가는 request code 같은데 정확하게 저 숫자가 뭘 의미하는지는 모르겠습니다.

다만 구분하기 위한 숫자이기에 특정 constant에 넣어 사용했습니다.

 

이상 간단하게 정리해본 Bar Code, QR Code 인식 Android 앱 만들기 정리 포스팅이였습니다.

 

728x90
반응형