Android : QR코드/바코드 생성, 스캔
Google의 xzing 라이브러리를 사용한다.
공식 Github 레파지토리 : https://github.com/zxing/zxing
1. 라이브러리 추가:
Maven:
1 2 3 4 5 6 | <!-- zxing --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency> |
Gradle:
1 | compile 'com.google.zxing:core:3.3.0' |
jar 파일을 이용하려면 아래 두 파일을 빌드패스에 추가하면 된다.
2. QR코드 생성 :
createQRCode() 메소드의 파라미터로 들어가는 context가 내용이 되며
multiFormatWriter.encode()의 파라미터로 들어가는 두 개의 숫자가 QR코드 이미지의 크기가 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class CreateQRCode { public Bitmap createQRCode(String context){ Bitmap bitmap = null ; MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); try { /* Encode to utf-8 */ Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); BitMatrix bitMatrix = multiFormatWriter.encode(context, BarcodeFormat.QR_CODE,300,300, hints); BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); bitmap = barcodeEncoder.createBitmap(bitMatrix); } catch (WriterException e) { e.printStackTrace(); } return bitmap; } } |
3. QR코드 스캔 :
액티비티를 생성한다. onCreate()는 이렇다.
스캔 뒤 결과를 가져오는게 역할의 전부다.
이 액티비티에 진입하면 곧바로 스캔모드가 활성화되게 된다. 따로 setContentView()가 필요없어 지웠다.
있어도 상관없던데, 가끔 오류의 원인이 된다는 글들이 있어서 지웠음.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class ScanActivity extends AppCompatActivity { /* QR code scanner 객체 */ private IntentIntegrator qrScan; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* QR code Scanner Setting */ qrScan = new IntentIntegrator(this); qrScan.setPrompt("아래 띄울 문구"); qrScan.initiateScan(); } |
QR코드 화면을 커스텀하고 싶다면 액티비티를 생성하고 원하는 위치에 TextView따위를 넣은 다음
initiateScan() 전에 다음과 같이 설정해주면 된다.
본인은 빈 액티비티를 넣어 세로모드로 설정했다. (기본은 가로모드)
1 2 | qrScan.setCaptureActivity(EmptyActivity.class); |
근데 사실 가로모드에서도 세로로 QR코드 스캔이 잘 되기때문에 굳이..
이외에도 스캔할때 비프음을 끈다던지 하는 사소한 옵션들을 설정할 수 있으니 포스팅 최상단 공식 github 참고.
QR코드를 인식하면 오버라이드한 onActivityResult() 메소드에서 처리한다.
얻은 내용을 갖고 다음 액티비티로 이동하든지, 내용이 url이면 해당 주소로 이동하든지 하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* Getting the Scan Results */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getContents() == null) { Log.v("qrcode :::::::::::", "no contents"); } else { //QR코드, 내용 존재 try { /* QR 코드 내용*/ String temp = result.getContents(); /* 로직 * * 로직 끝 */ Log.v("qrcode Contents :::::::::::", temp); Toast.makeText(getApplicationContext(), result.getContents(), Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); Log.v("Exception :::::::::::::", "QR code fail"); } } } else { super.onActivityResult(requestCode, resultCode, data); } } |
Output
세로모드로 잘 나오고, 스캔도 이상없이 진행된다.