본문 바로가기

Android

Android : QR코드/바코드 생성과 스캔, xzing 라이브러리

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>

cs


Gradle:

1
compile 'com.google.zxing:core:3.3.0'

cs


jar 파일을 이용하려면 아래 두 파일을 빌드패스에 추가하면 된다.


core-3.2.0.jar


javase-3.2.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;
    }
}

cs

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();
 
    }

cs


QR코드 화면을 커스텀하고 싶다면 액티비티를 생성하고 원하는 위치에 TextView따위를 넣은 다음 

initiateScan() 전에 다음과 같이 설정해주면 된다.

본인은 빈 액티비티를 넣어 세로모드로 설정했다. (기본은 가로모드)


1
2
qrScan.setCaptureActivity(EmptyActivity.class);
 

cs

근데 사실 가로모드에서도 세로로 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);
        }
    }

cs

Output

세로모드로 잘 나오고, 스캔도 이상없이 진행된다.