Android에서 바코드 스캐너 구현

소개



카메라나 GPS등 하드웨어 의존의 기능을 만들 때, 스마트폰은 편리하네요.
앱판 밖에 없는 기능을 담는 것으로, Web판과의 차별화도 할 수 있습니다.

이번에는 Android에서 バーコードスキャナー 기능을 구현하고 싶습니다.

실행 환경


  • Android Studio: 4.0.1
  • API Level: 29
  • Kotlin: 1.3.70

  • zxing-android-embedded : 4.1.0

  • 설치


    diff --git a/app/build.gradle b/app/build.gradle
    index be61190..22efbee 100644
    --- a/app/build.gradle
    +++ b/app/build.gradle
    @@ -6,6 +6,11 @@ android {
         compileSdkVersion 29
         buildToolsVersion "29.0.3"
    
    +    compileOptions {
    +        sourceCompatibility JavaVersion.VERSION_1_8
    +        targetCompatibility JavaVersion.VERSION_1_8
    +    }
    +
         defaultConfig {
             applicationId "com.example.barcodescanner"
             minSdkVersion 24
    @@ -29,6 +34,7 @@ dependencies {
         implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
         implementation 'androidx.core:core-ktx:1.3.1'
         implementation 'androidx.appcompat:appcompat:1.2.0'
    +    implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
         testImplementation 'junit:junit:4.12'
         androidTestImplementation 'androidx.test.ext:junit:1.1.2'
         androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    

    기본은 GitHub README에 따라 build.gradlegradle을 실행하면 설치됩니다.

    주요 활동 만들기


    package com.example.barcodescanner
    
    import android.annotation.SuppressLint
    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.Toast
    import com.google.zxing.integration.android.IntentIntegrator
    import com.google.zxing.integration.android.IntentResult
    
    class MainActivity : AppCompatActivity()
    {
        override fun onCreate(savedInstanceState: Bundle?)
        {
            super.onCreate(savedInstanceState)
    
            val intentIntegrator = IntentIntegrator(this).initiateScan()
        }
    
        @SuppressLint("ShowToast")
        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
        {
            val result: IntentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
    
            if (null != result) {
                val barcodeValue = result.contents
    
                if (null == barcodeValue) {
                    Toast.makeText(this, "Read Error", Toast.LENGTH_LONG).show()
                } else {
                    Toast.makeText(this, barcodeValue, Toast.LENGTH_LONG).show()
                }
            } else {
                super.onActivityResult(requestCode, resultCode, data)
            }
        }
    }
    
    IntentIntegrator 에서 처리를 바코드 스캐너로 이전합니다.onActivityResult 실장시의 작법으로서,
    호출원이 상정되고 있는 기능인 것을 보증하기 위해서, resultCode 의 값을 맞대거나 합니다만,
    Zxing에서는 그 변의 처리를 parseActivityResult() 로 실시하고 있습니다.

    매니페스트에 등록


    diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
    index 227c879..1e9db0a 100644
    --- a/app/src/main/AndroidManifest.xml
    +++ b/app/src/main/AndroidManifest.xml
    @@ -1,3 +1,4 @@
    +<?xml version="1.0" encoding="utf-8"?>
     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.example.barcodescanner">
    
    @@ -7,6 +8,14 @@
             android:label="@string/app_name"
             android:roundIcon="@mipmap/ic_launcher_round"
             android:supportsRtl="true"
    -        android:theme="@style/AppTheme" />
    +        android:theme="@style/AppTheme"
    +        android:hardwareAccelerated="true">
    +        <activity android:name=".MainActivity">
    +            <intent-filter>
    +                <action android:name="android.intent.action.MAIN" />
    +                <category android:name="android.intent.category.LAUNCHER" />
    +            </intent-filter>
    +        </activity>
    +    </application>
    
     </manifest>
    

    메인 액티비티를 매니페스트에 등록합니다.
    이 때 application 태그의 속성에 android:hardwareAccelerated=true를 추가하십시오.

    실행





    응용 프로그램을 시작하면 바코드 스캐너가 표시됩니다.



    바코드를 스캔하면 값이 팝업으로 표시됩니다.

    기타 설정



    경고음을 OFF로 설정


    diff --git a/app/src/main/java/com/example/barcodescanner/MainActivity.kt b/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    index 2040542..0fdb9ba 100644
    --- a/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    +++ b/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    @@ -14,7 +14,9 @@ class MainActivity : AppCompatActivity()
         {
             super.onCreate(savedInstanceState)
    
    -        val intentIntegrator = IntentIntegrator(this).initiateScan()
    +        val intentIntegrator = IntentIntegrator(this)
    +            .setBeepEnabled(false)
    +            .initiateScan()
         }
    
         @SuppressLint("ShowToast")
    

    IntentIntegrator 의 인스턴스 생성시, 메소드 체인으로 setBeepEnabled() 를 호출합니다.
    이 때 인수에 false를 전달하면 경고음이 꺼집니다.

    메시지 설정


    diff --git a/app/src/main/java/com/example/barcodescanner/MainActivity.kt b/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    index 2040542..a591c19 100644
    --- a/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    +++ b/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    @@ -14,7 +14,9 @@ class MainActivity : AppCompatActivity()
         {
             super.onCreate(savedInstanceState)
    
    -        val intentIntegrator = IntentIntegrator(this).initiateScan()
    +        val intentIntegrator = IntentIntegrator(this)
    +            .setPrompt("Test Message")
    +            .initiateScan()
         }
    
         @SuppressLint("ShowToast")
    



    IntentIntegrator 의 인스턴스 생성시, 메소드 체인으로 setPrompt() 를 호출합니다.
    이 때 인수에 문자열을 전달하면 화면의 메시지를 덮어 씁니다.

    화면을 가로 회전시키지 않음


    package com.example.barcodescanner
    
    import com.journeyapps.barcodescanner.CaptureActivity
    
    class Zxing : CaptureActivity() {}
    
    diff --git a/app/src/main/java/com/example/barcodescanner/MainActivity.kt b/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    index 2040542..8155461 100644
    --- a/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    +++ b/app/src/main/java/com/example/barcodescanner/MainActivity.kt
    @@ -14,7 +14,9 @@ class MainActivity : AppCompatActivity()
         {
             super.onCreate(savedInstanceState)
    
    -        val intentIntegrator = IntentIntegrator(this).initiateScan()
    +        val intentIntegrator = IntentIntegrator(this).apply {
    +            captureActivity = Zxing::class.java
    +        }.initiateScan()
         }
    
         @SuppressLint("ShowToast")
    


    CaptureActivity 를 상속한 활동을 만들고 IntentIntegrator를 호출할 때 지정합니다.

    후기



    OCR 공부 중입니다.
    하드웨어 성능도 관련됩니다만, 문자의 읽기 정밀도는 어느 정도입니까?
    매우 기대됩니다.

    좋은 웹페이지 즐겨찾기