본문으로 바로가기

[안드로이드]커스텀 zxing(custom바코드스캐너)

category Android 2017. 8. 29. 10:55

안녕하세요.


오늘은 안드로이드 스튜디오에서 사용되는 라이브러리중 하나인 zxing 을 알아보도록 하겠습니다.


zxing 은 안드로이드에서 바코드인식을 하기위해 많이 사용합니다.


https://github.com/journeyapps/zxing-android-embedded#custom-layout

(zxing 라이브러리 github입니다)


zxing 을 이용하여 바코드 인식하는 정보는 매우 많은데요. 


바코드를 커스텀하는 내용은 많이 없어서 이번에 간단히 바코드화면에 버튼을 넣은 간단한 커스텀 zxing을 알아보겠습니다.


(현재 만들고 있는 어플에 사용될 스캔화면)


보시는것처럼 좌측상단과 우측상단에 이미지 버튼을 만들어주어 톱니바퀴 모양을 누를경우 환경설정, 번개? 모양을 누를 경우 어두운 공간에서도 스캔이 가능하게 핸드폰의 라이트를 켜고 끌 수 있는 기능을 만들어두었습니다.


github의 자료를 받으시면 누구나 조금의 분석만 하면 커스텀할수 있습니다.


하지만 그 시간도 절약 할 수 있게 간단히 알려드릴게요.


compile 'com.journeyapps:zxing-android-embedded:3.5.0'

먼저 zxing사용을 위해 dependencies 에 zxing라이브러리를 추가해 줍시다!


다음으로 저는 4개의 클래스를 사용하였습니다.


AnyOrientationCaptureActivity 는 스캔화면의 세로형을 위해 만듭니다.

public class AnyOrientationCaptureActivity extends CaptureActivity {

}

CaptureActivity를 상속받는 빈 class를 만들어서 

<activity
            android:name=".AnyOrientationCaptureActivity"
            android:screenOrientation="fullSensor"
            android:stateNotNeeded="true"
            android:theme="@style/zxing_CaptureTheme"
            android:windowSoftInputMode="stateAlwaysHidden"></activity>

manifests 에 엑티비티를 추가해주면 세로모드가 가능합니다.



BackPressCloseHandler 는 제가 필요해서 만든 class 로 저는 main화면이 스캐너화면이라 onResume 에서 스캔화면을 계속불러 오기때문에 한번의 close로는 종료가 되지않아 두번 누르면 activity.finishAffinity(); 모든 엑티비티가 종료되도록 만들어 두었습니다. 이 finishAffinity() 는 api16 이상부터 사용가능합니다.


CustomScannerActivity 는 커스텀스캐너를 불러오고 라이트 넣어놓은 class 입니다.

    private CaptureManager capture;
    private DecoratedBarcodeView barcodeScannerView;

여기서는 CaptureManager와 DecoratedBarcodeView 를 통해 커스텀한 xml을 불러와 스캔화면에 적용시켜줍니다.

barcodeScannerView = (DecoratedBarcodeView)findViewById(R.id.zxing_barcode_scanner); barcodeScannerView.setTorchListener(this);

DecorateBarcodeView 에 만들어둔 xml 을 적용시키고 라이트를 켜고끄기위한 Torch리스너를 연결하였습니다.


        capture = new CaptureManager(this, barcodeScannerView);
        capture.initializeFromIntent(getIntent(), savedInstanceState);
        capture.decode();

그리고 CaptureManager 에 DecorateBarcodeView 를 연결시켜준뒤 decode 를 해주면 됩니다.



Main 에서는 

        IntentIntegrator integrator = new IntentIntegrator(this);
        integrator.setCaptureActivity(CustomScannerActivity.class);
        integrator.initiateScan();

커스텀 엑티비티를 initiateScan() 해주어 스캔을 불러와서 사용할수있게 하였습니다. 저는 Resume 에서 불러와 계속스캔화면을 불러올수 있게 하였습니다(main이 스캔)


그리고 결과값을 받아오기위하여 

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        Log.d("onActivityResult", "onActivityResult: .");
        if (resultCode == Activity.RESULT_OK) {
            IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
            String re = scanResult.getContents();
            String message = re;
            Log.d("onActivityResult", "onActivityResult: ." + re);
            Toast.makeText(this, re, Toast.LENGTH_LONG).show();
        }
    }

onActivityResult 를 오버라이드하여 바코드값을 토스트로 확인할수 있습니다.



xml은 

activity_custom_scanner 에서 custom_barcode_scanner 를 layout하게 되어있습니다.




글을 쓰다보니 내용이 이상해 진거 같은데 ㅜㅜ


자세한 코드나 도움이 필요하면 댓글남겨주세요



--------------------------------------------------------------------------------------------------------------------------------------

코드원하시는분이 많아 깃에 올려두었습니다.

https://github.com/dolsanta/CustomZxingTest