본문 바로가기

안드로이드/코드

[안드로이드] QR코드 인식해서 로또 당첨 조회 하기

반응형

 

 

qrcode_title

 

 

 

 

 

qrcode2

 

 

QR코드를 스마트폰의 카메라로 스캔해서 로또 당첨 조회를 하는 예제를 만들어보겠습니다.

 

 

1. build.gradle(Module: app)

defaultConfig {
        applicationId "com.everyshare.qrcode"
        minSdkVersion 24
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

sdk 최소 버전은 24로 설정해주셔야 합니다.

minSdkVersion 24 - 이 부분만 수정했습니다.

 

dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.journeyapps:zxing-android-embedded:4.0.0'
    implementation 'com.google.zxing:core:3.3.0'
}

 

androidx를 사용하셔야 합니다.

기존 프로젝트를 androidx로 변경해야 하시는 분은 링크를 참고해주세요.

 

2. AndroidManifest.xml

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

인터넷, 카메라 권한 추가

 

 

<activity
     android:name="com.journeyapps.barcodescanner.CaptureActivity"
     android:screenOrientation="portrait"
     tools:replace="android:screenOrientation"
     android:stateNotNeeded="true">
</activity>

스캐너의 세로 모드를 사용하기 위해서 추가했습니다.

가로 모드를 사용하실 분들은 추가하지 않으셔도 됩니다.

 

 

android:hardwareAccelerated="true"
android:usesCleartextTraffic="true"

<application 태그 안에 추가해줍니다.

 

 

 

3. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText android:id="@+id/et"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="http://"
            android:imeOptions="actionSearch"
            android:maxLines="1"
            android:inputType="textUri"/>
        <Button
            android:id="@+id/bt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:visibility="gone"
            android:text="이동"/>
    </LinearLayout>
    <WebView android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

 

 

 

4. CaptureActivity.java (세로 모드를 사용하실 분은 추가해주세요, 가로 모드는 추가 안 하셔도 됩니다.)

public class CaptureActivity extends com.journeyapps.barcodescanner.CaptureActivity {

}

 

 

5. MainActivity.java

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.journeyapps.barcodescanner.CaptureActivity;

public class MainActivity extends AppCompatActivity{

    WebView wv;
    EditText et;
    Button bt;
    IntentIntegrator integrator;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = findViewById(R.id.et);
        wv = findViewById(R.id.wv);

        bt = findViewById(R.id.bt);
        WebSettings webSettings = wv.getSettings();

        //자바 스크립트 사용을 할 수 있도록 합니다.
        webSettings.setJavaScriptEnabled(true);

        wv.setWebViewClient(new WebViewClient(){
        //페이지 로딩이 끝나면 호출됩니다.
        @Override
        public void onPageFinished(WebView view,String url){
            Toast.makeText(MainActivity.this,"로딩 끝", Toast.LENGTH_SHORT).show();
            }
        });
        et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEARCH){
                    //bt의 onClick을 실행
                    bt.callOnClick();
                    //키보드 숨기기
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(),0);
                    return true;
                }
                return false;
            }
        });


        integrator = new IntentIntegrator(this);



        //바코드 안의 텍스트
        integrator.setPrompt("바코드를 사각형 안에 비춰주세요");

        //바코드 인식시 소리 여부
        integrator.setBeepEnabled(false);


        integrator.setBarcodeImageEnabled(true);

        integrator.setCaptureActivity(CaptureActivity.class);

        //바코드 스캐너 시작
        integrator.initiateScan();
    }

    public void onClick(View view){
        String address = et.getText().toString();

        if(!address.startsWith("http://")){
            address = "http://" + address;
        }

        wv.loadUrl(address);
    }

    @Override
    public void onBackPressed() {
        if(wv.isActivated()){
            if(wv.canGoBack()){
                wv.goBack();
            }else{
                //스캐너 재시작
                integrator.initiateScan();
            }

        }else{
            super.onBackPressed();
        }


    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);

        if(result != null){
            if(result.getContents() == null){

            }else{
                //qr코드를 읽어서 EditText에 입력해줍니다.
                et.setText(result.getContents());

                //Button의 onclick호출
                bt.callOnClick();

                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_SHORT).show();
            }
        }else{
            super.onActivityResult(requestCode, resultCode, data);
        }

    }
}

 

이전에 포스팅했던 웹뷰 예제에서 qr코드를 읽어서 웹뷰에 띄워주는 코드만 추가했습니다.

 

웹뷰 사용 예제가 궁금하신 분들은 링크를 클릭해서 확인해주세요.

 

코드는 링크를 참고하여 만들었습니다.

 

 

반응형