반응형
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코드를 읽어서 웹뷰에 띄워주는 코드만 추가했습니다.
웹뷰 사용 예제가 궁금하신 분들은 링크를 클릭해서 확인해주세요.
코드는 링크를 참고하여 만들었습니다.
반응형
'안드로이드 > 코드' 카테고리의 다른 글
[안드로이드] Json 데이터를 받아서 한번에 객체에 담기 - JsonObjectRequest, JSONObject, Gson (0) | 2020.01.25 |
---|---|
[안드로이드] 랜덤으로 로또 번호 자동 생성해서 번호 이미지 띄우기 (49) | 2020.01.09 |
[온라인마케팅] 애드센스 크롤러 액세스 등록 (0) | 2020.01.07 |
[안드로이드] 웹뷰 사용하기 - WebView (2) | 2020.01.06 |
[안드로이드] 커스텀 토스트(Toast), 스낵바(Snackbar) 사용하기 (0) | 2020.01.05 |