본문 바로가기
안드로이드

바코드, QR CODE 생성 및 스캐너

by 아카이sun 2019. 9. 12.

바코드는 문자와 숫자를 막대와 공백으로 표시함으로서 상품관리를 편리하게 하는 것으로 가장 간단하게 구현하는 방법에 대해 알아보겠습니다.

 

 

gradle에 다음의 라이브러리들을 추가합니다. 

//바코드 읽기
implementation 'com.budiyev.android:code-scanner:2.1.0'

//바코드 쓰기
implementation('com.journeyapps:zxing-android-embedded:3.6.0') { transitive = false }

 

zxing에서 제공하는 바코드 유형은 17개정도인데 아래는 QR_CODE를 생성하는 예제입니다. 이 외에도 CODE_39나 CODE_93등의 바코드 유형도 생성가능합니다.

val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap(string, BarcodeFormat.QR_CODE, width, height)
imageView.setImageBitmap(bitmap)

 

위의 방법도 간편하지만 glide를 사용하여 조금 더 작업해 보도록 합니다.

val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap(string, BarcodeFormat.QR_CODE, width, height)

Glide.with(context)
  .load(bitmap)
  .skipMemoryCache(true)
  .override(width, height)
  .fitCenter()
  .placeholder(progressDrawable)
  .error(errorDrawable)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView)

 

 

 

 

다음은 바코드 스캔입니다.

val scanner = CodeScanner(this, barcode_scanner_view)

codeScanner.apply {
  camera = CodeScanner.CAMERA_BACK // or CAMERA_FRONT or specific camera id
  formats = CodeScanner.ALL_FORMATS // list of type BarcodeFormat, // ex. listOf(BarcodeFormat.QR_CODE)
  autoFocusMode = AutoFocusMode.SAFE // or CONTINUOUS
  scanMode = ScanMode.CONTINUOUS // or CONTINUOUS or PREVIEW
  isAutoFocusEnabled = true // Whether to enable auto focus or not

  decodeCallback = DecodeCallback {
  	runOnUiThread {
    	Toast.makeText(context, it.text, Toast.LENGTH_LONG).show()
    }
  }

  errorCallback = ErrorCallback { // or ErrorCallback.SUPPRESS
    runOnUiThread {
      Toast.makeText(context, "Camera initialization error: ${it.message}",
      Toast.LENGTH_LONG).show()
    }
  }
}

 

decodeCallback으로 스캔된 데이터가 넘어옵니다.

camera는 정면 후면을 지정할 수있으며 format지정으로 원하는 바코드의 종류만 스캔할 수 있습니다.

ScanMode가 프리뷰일때는 스캔이 되지않으며 그냥 카메라 프리뷰 지원으로 커스텀 버튼을 생성하여 버튼을 누를시 스캔이 가능하도록 구현할 수도 있습니다.

 

앱의 생명주기에 따라 프리뷰 시작과 리소스를 해제시켜주는 작업도 필요합니다.

또한 카메라권한을 사용하기 때문에 퍼미션체크도 해주셔야합니다.

override fun onRestart() {
  super.onRestart()
  scanner.startPreview()
}

override fun onPause() {
  scanner.releaseResources()
  super.onPause()
}

댓글