์ค๋๋ง์ ํฌ์คํ ์ ํด๋ณธ๋ค.
์์ฆ ์ข ๋ฐ๋น ์ ใ
ใ
(์ฌ์ค ๊ท์ฐฎ๊ธฐ๋ ํ๊ณ ๊น๋จน์์ด์ ๋ชป ์ฌ๋ ธ๋ค ์ฃ์กํฉ๋๋ค.)
์๋ฌดํผ ์ด๋ฒ์ ์ฌ์ฉํด ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ zxing ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ, ์ด๋ฒ ํ๋ก์ ํธ์ QR์ฝ๋ ์ค์บ ๊ธฐ๋ฅ์ด ๋ค์ด๊ฐ ์์ ์ด๋ผ ๊ฒ์์ ํด๋ดค๋๋, Zxing ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ธธ๋ ๋ฐ๋ก ์ฌ์ฉํด ๋ณด์๋ค(ํคํค)
๊ฐ์๋ฆฌ๋ ์ฌ๊ธฐ๊น์ง ํ๊ณ ๋ฐ๋ก Zxing์ ๋ํด ์์๋ณด์
1. dependency ์ถ๊ฐ,์ธํ
build.gradle(app)build.gradle(app)
// zxing
implementation 'com.journeyapps:zxing-android-embedded:4.2.0'
// circle imageview(์์ ์์ ์ฌ์ฉ)
implementation 'de.hdodenhof:circleimageview:3.1.0'
Zxing์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด ์ค๋ค.
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />
์นด๋ฉ๋ผ ํผ๋ฏธ์
๋ ์ถ๊ฐํด ์ค๋ค(QR์ค์บํ๋๊น ๋น์ฐํ์ง)
2. xml
์ฒซ ํ๋ฉด์์ ๋ฒํผ์ ๋๋ฅด๋ฉด QR์ฝ๋ ์ค์บํ๋ฉด์ด ๋์ค๋๋ก UI๋ฅผ ์์ฑํ๋ค.
activity_scan.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".example4.Scan4Activity">
<Button
android:id="@+id/scan_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start to scan code"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
activity_result.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".example4.ResultActivity">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/decorated_bar_code_view"
android:layout_width="300dp"
android:layout_height="300dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/flash_image"
android:layout_width="60dp"
android:layout_height="60dp"
app:civ_circle_background_color="#e5f5f5"
android:src="@drawable/flashlight"
app:layout_constraintEnd_toEndOf="@+id/decorated_bar_code_view"
app:layout_constraintStart_toStartOf="@+id/decorated_bar_code_view"
app:layout_constraintTop_toBottomOf="@+id/decorated_bar_code_view" />
</androidx.constraintlayout.widget.ConstraintLayout>
3. activtiy ์์ฑ
ScanActivity.kt
package com.example.qrpractice.example4
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.qrpractice.R
import com.example.qrpractice.databinding.ActivityScan4Binding
import com.google.zxing.integration.android.IntentIntegrator
class Scan4Activity : AppCompatActivity() {
private lateinit var binding: ActivityScan4Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityScan4Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.scanBtn.setOnClickListener {
val integrator = IntentIntegrator(this)
with(integrator) {
setBeepEnabled(false)
captureActivity = ResultActivity::class.java
initiateScan()
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
val scanRes = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
val content = scanRes.contents
Toast.makeText(this, content, Toast.LENGTH_SHORT).show()
} else Toast.makeText(this, "์ธ์ ์คํจ", Toast.LENGTH_SHORT).show()
}
}
scan activity์์๋ ์ค์บ ํ๋ฉด์ผ๋ก ๊ฐ๊ธฐ ์ํ ์ธํ ๊ณผ ์ค์บํ๊ณ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ์ญํ ์ ํ๋ค.
setonclicklistener์์๋ ์ค์บ ํ๋ฉด์ผ๋ก ๊ฐ๊ธฐ ์ํ ์ธํ ์ ํ๋ค.
- setBeepEnabled(boolean): ๋ฐ์ฝ๋ ์ธ์ ์ "์" ์๋ฆฌ๋ฅผ ๋๊ฒ ํ๋ค.
- captureActivity: ์ค์บ ํ๋ฉด์ผ๋ก ์ด๋ํ activity๋ฅผ ์ค์ ํ๋ค.
- initiateScan: ์ด๊ธฐํ
onActivityResult์์๋ ๋ฐ์ฝ๋๋ฅผ ์ธ์ํ๊ณ ๋ ํ์ ๋ก์ง์ ์ํํ๋ค.
- content: ์ธ์ํ URL์ ๊ฐ์ ธ์จ๋ค.
๊ฒฐ๊ณผ
์ ๋ฆฌ
๋ฐฐ์ฐ๋ฉด์ ์ฝ๋๋ก ๋ฐ์ฝ๋ ์ค์บ์ ๋ง๋๋ ๊ฒ๊ณผ DecoratedBarCodeView๋ฅผ ์ฌ์ฉํด์ ๋ง๋๋ ๊ฒ๊ณผ ํท๊ฐ๋ ค์ ํค๋งธ๋ ๊ธฐ์ต์ด ์๋ค(์ง๊ธ ์๊ฐํ๋ฉด ํํ๊ฐ ์ค์ง๋ง).
์์ผ๋ก ํฌ์คํ
์์ฃผ ํ๊ฒ ์ต๋๋ค(์์ฃผ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค).