코틀린으로 작성한 안드로이드 바코드 인식하기에 대하여 알아보기

오늘은 안드로이드에서 바코드를 인식하는 라이브러리인 zxing을 코틀린으로 작성해보았습니다.

설정

implementation 'me.dm7.barcodescanner:zxing:1.9.8'

라이브러리를 가져옵니다.

카메라 권한

<uses-permission android:name="android.permission.CAMERA" />

바코드 인식에는 카메라 권한이 필요하므로, 카메라 권한을 가져옵니다.

안드로이드 6.0 이상이면, 따로 권한을 물어보아야 하므로 아래와 같은 코드를 권한을 물어볼 엑티비티에 코드를 넣어줍니다.

ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA),Constants.RECORD_REQUEST_CODE)

override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<String>, grantResults: IntArray) {
    when (requestCode) {
        Constants.RECORD_REQUEST_CODE -> {
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED || grantResults[2] != PackageManager.PERMISSION_GRANTED) {
            } else {
                Handler().postDelayed({
                    val intent = Intent(this@SplashActivity, MainActivity::class.java)
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                    startActivity(intent)
                }, 2500)
            }
        }
    }
}

onRequestPermissionsResult 메소드를 오버라이딩해서 권한이 다 들어오게 될 때만 다른 엑티비티로 넘어가게 작성했습니다.

엑티비티

이제 카메라 화면이 나오는 엑티비티를 만들어야 합니다.

class ScanActivity  : AppCompatActivity(), ZXingScannerView.ResultHandler{
    private var mScannerView: ZXingScannerView? = null

    public override fun onCreate(state: Bundle?) {
        super.onCreate(state)
        mScannerView = ZXingScannerView(this)
        setContentView(mScannerView)
    }

    public override fun onResume() {
        super.onResume()
        mScannerView!!.flash = true
        mScannerView!!.setAutoFocus(true)
        mScannerView!!.setResultHandler(this)
        mScannerView!!.startCamera()
    }

    public override fun onPause() {
        super.onPause()
        mScannerView!!.stopCamera()
    }

    override fun handleResult(rawResult: Result) {
        val intent = Intent(this@ScanActivity, InActivity::class.java)
        intent.putExtra("result_msg", rawResult.text)
        setResult(RESULT_OK, intent)
        finish()
    }

}

ZXingScannerView.ResultHandler를 상속받아서 onCreate, onResume, onPause, handleResult를 오버라이드해줍니다.

엑티비티가 시작되었을 때에 onCreate와 onResume이 실행되므로, 켜지자마자 mScannerView 객체가 생성되며 각종 옵션(플래시, 오토포커스)들을 boolean 값으로 설정할 수 있습니다.

그리고 startCamera 메소드로 카메라가 작동하게 됩니다.

onPause, 즉 중지되었을 때에는 stopCamera 메소드로 인해 카메라가 꺼지게 되고, 오버라이드한 handleResult 메소드로 인식된 바코드를 putExtra를 통해 전달하게 됩니다.

메인으로 값 가져오기

val intent = Intent(this@CountActivity, ScanActivity::class.java)
            startActivityForResult(intent, Constants.REQUEST1)

처음에 카메라 엑티비티로 넘어가기 전에 startActivityForResult 메소드로 값을 반환 받을 준비도 합니다.

var getStr = ""
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == Constants.REQUEST1) {
            if (resultCode == RESULT_OK) {
                getStr = data?.getStringExtra(Constants.RESULT_MSG).toString()
                bind.shelfNameText.setText(getStr)
            } else {
                getStr = ""
            }

        }
    }

onActivityResult 메소드를 오버라이드하여 카메라 엑티비에서 들어온 requestCode를 확인하여 getStringExtra로 값을 받아들입니다.

위 코드에서는 shelfNameText라는 edittext에 setText 메소드로 문자열을 설정했습니다.

Written on July 17, 2018