Kotlinでのバーコード読み取りをステップバイステップの12選で解説

Kotlin言語を使用してバーコードを読み取るAndroidアプリの開発手順 Kotlin
この記事は約24分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、Kotlinを使用してバーコード読み取り機能を持つAndroidアプリを自分で作成することができるようになります。

バーコード技術は、商品の管理からイベントのチケット管理まで、さまざまなシーンで利用されています。

今回は、初心者向けに、Kotlinを使ったAndroidアプリ開発でのバーコード読み取りの基本から応用までを、わかりやすく説明します。

●Kotlinとは

Kotlinは、JetBrainsによって開発されたモダンなプログラミング言語です。

Javaと互換性がありながら、よりシンプルで安全なコードを書くことができるため、Androidアプリ開発の主流となっています。

○Kotlinの特徴とメリット

Kotlinは、Javaよりも簡潔な記述が可能であり、null安全な設計が採用されています。

これにより、Nullポインタの例外を防ぐことが容易になっています。

また、ラムダ式や拡張関数など、多くの機能が追加されているため、より効率的なプログラミングが可能です。

○Androidとの相性

Kotlinは、Googleによって公式にAndroidの開発言語としてサポートされています。

そのため、Android StudioではKotlinのコードをシームレスに書くことができ、Javaとの相互運用も容易です。

特に、AndroidのAPIを利用する際に、Kotlinの機能を活かすことで、より直感的で簡潔なコードを実現することができます。

●バーコード読み取りとは

日常生活で頻繁に目にするバーコード。

スーパーやコンビニでの商品のレジ通過時や、宅配便の伝票に記載されているコードなど、私たちの生活には欠かせない存在となっています。

では、バーコードとは具体的にどのようなものなのでしょうか。

○バーコードの種類

バーコードにはいくつかの主要な種類が存在します。

  1. 一次元バーコード(1D):最も一般的なバーコードで、縦のラインの太さや間隔で情報を表現します。例としては、UPCやEANコードなどがあります。
  2. 二次元バーコード(2D):情報量が多く、縦横の2方向にデータが記録されています。QRコードやDatamatrix、PDF417などがあります。
  3. スタック式バーコード:複数の1Dバーコードを積み重ねた形状を持つバーコード。情報量は1Dよりも多いです。

これらのバーコードにはそれぞれ特有の特徴や利用シーンがあり、目的に応じて選択されます。

○バーコードの利点と用途

バーコード技術が広く利用される背景には、次のようなメリットがあります。

  1. 迅速なデータ入力:手入力に比べて圧倒的なスピードでのデータ取得が可能です。
  2. 誤入力の低減:手動での入力ミスを大幅に削減できます。
  3. コンパクトに多くの情報を格納:特に2Dバーコードは、小さな面積に大量の情報を格納できます。

用途としては、製品の管理や在庫管理、書籍の管理コード、イベントや映画のチケット、医療現場での患者情報の管理など、多岐にわたります。

●開発環境のセットアップ

バーコード読み取りアプリの開発を始める前に、適切な開発環境を整えることが重要です。

KotlinでのAndroidアプリ開発に必要なツールやライブラリ、さらにバーコード読み取りのための特定のライブラリのインストール方法について説明します。

○必要なツールとライブラリ

KotlinでのAndroidアプリ開発には、次のツールが必要です。

  1. Android Studio:Googleが公式にサポートしているAndroid開発専用の統合開発環境です。Kotlinもサポートされており、バーコード読み取りアプリの開発に最適です。
  2. JDK (Java Development Kit):Androidアプリ開発の基盤となるJavaの開発キットです。Android StudioのインストールとともにJDKもセットアップされます。
  3. Android SDK:Androidアプリを開発するためのソフトウェア開発キットです。Android Studioに組み込まれています。

次に、バーコード読み取りのための専用ライブラリについて見ていきましょう。

多くのライブラリが提供されていますが、ここではZxingとZbarの二つを取り上げます。

  1. Zxing:Googleがサポートするオープンソースのバーコード読み取りライブラリで、多くのAndroidアプリで利用されています。
  2. Zbar:Zxingに比べて読み取り速度が速いとされるバーコードライブラリです。一部の特殊なバーコードフォーマットにも対応しています。

これらのライブラリは、Android StudioのプロジェクトでGradleを使用して簡単に追加できます。

○サンプルコード1:バーコード読み取りの基本セットアップ

Kotlinを用いたAndroidアプリでのバーコード読み取りを行う基本的なセットアップについてサンプルコードと共に説明します。

まず、Android Studioで新しいプロジェクトを作成します。

そして、build.gradleファイルに必要なライブラリを追加します。

dependencies {
    // ... その他の依存関係 ...
    implementation 'com.google.zxing:core:3.x.x'
    implementation 'com.journeyapps:zxing-android-embedded:4.x.x'
}

上記のコードではZxingのコアライブラリとAndroid用のZxingライブラリを追加しています。

これにより、アプリ内でバーコード読み取りの機能が使用できるようになります。

このコードの実行結果として、指定されたバーコード読み取りライブラリがプロジェクトに追加されます。

これにより、アプリでバーコードを読み取るための基本的な準備が整いました。

○サンプルコード2:カメラのアクセス許可を求める

バーコード読み取りのためには、スマートフォンのカメラへのアクセス許可が必要です。

Androidアプリでは、ユーザのプライバシーを守るために、特定の機能やデータへのアクセスを求める際にはユーザから明示的な許可を得る必要があります。

ここでは、Kotlinでのカメラアクセス許可の取得方法について詳しく説明します。

まず、アプリのマニフェストファイル(AndroidManifest.xml)に、カメラへのアクセスを求めるためのパーミッションを追加します。

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

次に、実際にカメラのアクセス許可を求めるコードを書きます。

ここでは、Activity内でカメラのアクセス許可を求めるサンプルコードを紹介します。

// 必要なインポートを追加
import android.Manifest
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

// ...

private val CAMERA_REQUEST_CODE = 1

fun checkCameraPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) 
        != PackageManager.PERMISSION_GRANTED) {
        // カメラの許可がされていない場合、許可を求めるダイアログを表示
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_REQUEST_CODE)
    }
}

上記のコードでは、まず現在のアクセス許可の状態を確認しています。

カメラへのアクセスが許可されていない場合、ユーザに許可を求めるダイアログが表示されます。

このコードを実行すると、アプリがカメラへのアクセスを初めて求める際、ユーザに許可を求めるダイアログが表示されます。

ユーザが許可すると、アプリはカメラを使用できるようになります。

許可しない場合、アプリ内でのバーコード読み取り機能など、カメラに関連する機能は利用できなくなります。

○サンプルコード3:バーコード読み取りライブラリの導入

Androidアプリでのバーコード読み取りを効率的に実現するために、専用のライブラリを利用することが一般的です。

ライブラリを使用することで、カメラ操作やデータ処理などの複雑な作業をシンプルに実装することができます。

今回は、Android向けの代表的なバーコード読み取りライブラリであるZxingを導入し、バーコード読み取りの基本的な手法について解説します。

最初に、build.gradle (Module: app) ファイルに必要な依存関係を追加します。

dependencies {
    // ... 他の依存関係 ...

    implementation 'com.google.zxing:core:3.4.1'
    implementation 'com.journeyapps:zxing-android-embedded:4.2.0'
}

これにより、ZxingライブラリとそのAndroid用の拡張ライブラリをプロジェクトに追加することができます。

次に、バーコードを読み取るための簡単な実装を行います。

ここでは、ボタンをクリックした際にバーコードスキャナーを起動し、読み取った結果を画面に表示するサンプルコードを紹介します。

import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.google.zxing.integration.android.IntentIntegrator

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val scanButton: Button = findViewById(R.id.scanButton)
        val resultTextView: TextView = findViewById(R.id.resultTextView)

        scanButton.setOnClickListener {
            val integrator = IntentIntegrator(this)
            integrator.initiateScan()
        }
    }

    // スキャン結果を取得
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        if (result != null) {
            if (result.contents == null) {
                Toast.makeText(this, "読み取りキャンセル", Toast.LENGTH_LONG).show()
            } else {
                resultTextView.text = "読み取り結果: ${result.contents}"
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }
}

上記のコードにおいて、IntentIntegratorクラスを利用してバーコード読み取りのアクティビティを起動します。

読み取った結果はonActivityResultメソッド内で取得し、結果をテキストビューに表示します。

このコードを実行すると、アプリ上のボタンをクリックするとバーコードスキャナーが起動します。

バーコードを正確に読み取ると、読み取り結果が画面上のテキストビューに表示されます。

読み取りをキャンセルした場合は、キャンセルメッセージが表示されます。

○サンプルコード4:読み取ったデータの表示

バーコードの読み取りが成功した後、最も重要なステップは、そのデータを適切に表示することです。

バーコードから得られる情報は通常テキストデータですが、それをどのようにユーザーに提示するかが、アプリのユーザビリティを左右する要因となります。

ここでは、先ほどのZxingライブラリを使用して読み取ったデータをAndroidアプリのテキストビューに表示する方法を解説します。

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.zxing.integration.android.IntentIntegrator

class MainActivity : AppCompatActivity() {
    private lateinit var resultTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val scanButton: Button = findViewById(R.id.scanButton)
        resultTextView = findViewById(R.id.resultTextView)

        scanButton.setOnClickListener {
            val integrator = IntentIntegrator(this)
            integrator.initiateScan()
        }
    }

    // バーコード読み取りの結果を受け取る
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        if (scanResult != null) {
            if (scanResult.contents == null) {
                Toast.makeText(this, "読み取りキャンセル", Toast.LENGTH_LONG).show()
            } else {
                // 読み取ったデータをテキストビューに表示
                resultTextView.text = "バーコード内容: ${scanResult.contents}"
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }
}

このコードを実行すると、読み取ったバーコードのデータはresultTextViewに表示されます。

こうしてユーザーは、バーコードスキャンの結果を即座に確認できます。

また、読み取りがキャンセルされた場合は、Toastメッセージでユーザーにキャンセルしたことを知らせます。

このようなユーザーフィードバックは、アプリの使い勝手を向上させる要因となります。

●バーコード読み取りの応用例

バーコード技術は多岐にわたる用途があります。

ショッピングアプリからチケット予約アプリまで、さまざまな場面で利用されています。

Kotlinでのアプリ開発においても、この技術を活用することでアプリの価値を高めることができます。

○サンプルコード5:読み取ったバーコードデータをデータベースに保存

バーコードを読み取った後、そのデータをローカルのデータベースやクラウド上のデータベースに保存することも考えられます。

下記のコードは、読み取ったバーコードデータをAndroidのローカルデータベース(Room)に保存する例を表しています。

@Entity
data class BarcodeData(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val barcodeValue: String
)

@Dao
interface BarcodeDao {
    @Insert
    fun insert(barcodeData: BarcodeData)
}

@Database(entities = [BarcodeData::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun barcodeDao(): BarcodeDao
}

// バーコードを読み取った後の処理
val barcodeValue = "読み取ったバーコードの値"
val barcodeData = BarcodeData(0, barcodeValue)

val db = Room.databaseBuilder(
    applicationContext,
    AppDatabase::class.java, "database-name"
).build()

db.barcodeDao().insert(barcodeData)

このコードを実行すると、バーコードデータがデータベースに保存されます。

こうしたデータの保存は、後で再度その情報を参照する場合や、商品の履歴をトラックする場合などに役立ちます。

○サンプルコード6:読み取ったデータをWebAPIに送信

アプリケーションでは、読み取ったバーコードデータを外部のサーバーやAPIに送信するケースもあります。

例えば、商品の価格や詳細情報を取得するために、外部のデータベースと連携する場合などです。

val barcodeValue = "読み取ったバーコードの値"

val client = OkHttpClient()
val requestBody = FormBody.Builder()
    .add("barcode", barcodeValue)
    .build()

val request = Request.Builder()
    .url("https://example.com/api/barcode")
    .post(requestBody)
    .build()

client.newCall(request).execute().use { response ->
    if (response.isSuccessful) {
        val responseBody = response.body?.string()
        // レスポンスを適切に処理
    } else {
        // エラーハンドリング
    }
}

上記のコードは、読み取ったバーコードデータをWebAPIにPOSTメソッドで送信し、レスポンスを受け取る処理を表しています。

実際のアプリケーションでは、セキュリティの観点からHTTPSのエンドポイントを使用し、適切なエラーハンドリングを行うことが重要です。

○サンプルコード7:カスタムUIでのバーコード読み取り

バーコードを読み取る際のUIは、ライブラリのデフォルトのものを使用することもできますが、アプリのデザインやブランドに合わせてカスタマイズすることも考えられます。

下記のコードは、Zxingライブラリを使用してカスタムUIでバーコードを読み取る例を表しています。

val integrator = IntentIntegrator(this)
integrator.setCaptureActivity(CustomScannerActivity::class.java)
integrator.initiateScan()

このコードを使用することで、CustomScannerActivityという独自にデザインしたアクティビティでバーコードを読み取ることができます。

●バーコード読み取りのカスタマイズ方法

Kotlinを使用したAndroidアプリ開発では、バーコード読み取りの実装方法を多岐にわたってカスタマイズすることができます。

ユーザーのニーズやアプリの要件に合わせて、読み取りの精度や速度を最適化したり、特定のバーコードだけを対象とした読み取りを実現することも可能です。

ここでは、そのようなカスタマイズの方法を具体的なサンプルコードとともに解説していきます。

○サンプルコード8:読み取り範囲のカスタマイズ

通常、バーコード読み取りライブラリは画面全体を対象に読み取りを行いますが、読み取り対象の範囲を限定することで、誤読のリスクを減少させることができます。

// ZXingライブラリを用いた例
val integrator = IntentIntegrator(this)
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES)
integrator.setScanningRectangle(100, 200, 300, 400)
integrator.initiateScan()

このコードでは、読み取り範囲をスクリーン上の特定の位置とサイズに指定しています。

具体的には、左上の座標が(100, 200)、範囲のサイズが幅300、高さ400の領域だけを読み取り対象としています。

○サンプルコード9:読み取り速度の最適化

読み取り速度は、ユーザーエクスペリエンスに直接影響する要因の一つです。

特に、大量のバーコードを連続して読み取る場面では、読み取り速度の最適化が求められます。

// ZXingライブラリを用いた例
val integrator = IntentIntegrator(this)
integrator.setCameraId(0)  // デフォルトカメラを使用
integrator.setBeepEnabled(false)  // ビープ音をオフにする
integrator.setBarcodeImageEnabled(true)  // 画像処理の最適化
integrator.initiateScan()

上記のコードでは、ビープ音をオフにして余分な処理を減らし、画像処理を最適化して読み取り速度を向上させています。

○サンプルコード10:マルチバーコード読み取りの実装

一度のスキャンで複数のバーコードを読み取ることも、一部のライブラリではサポートされています。

この機能は、商品の一括登録など、大量のバーコードを効率よく処理する場面で役立ちます。

// ZXingライブラリを用いた例
val integrator = IntentIntegrator(this)
integrator.setOrientationLocked(false)  // 画面の向きを固定しない
integrator.setPrompt("複数のバーコードをスキャンしてください")
integrator.initiateScan()

このコードを実行すると、ユーザーは画面上に映る複数のバーコードを一度に読み取ることができます。

読み取った結果は、戻り値としてのIntentに含まれるバーコードのリストとして取得することができます。

●注意点と対処法

バーコード読み取り技術は、日常的に多くの業界で利用されている非常に便利な技術です。

しかし、その実装や運用にはいくつかの注意点や落とし穴が存在します。

ここでは、Kotlinを使ったAndroidアプリでのバーコード読み取りに関する主な注意点とその対処法を解説します。

○バーコードの読み取り失敗とその原因

バーコードの読み取りは、さまざまな要因で失敗することがあります。

主な原因としては、バーコードの品質の低さ、カメラのフォーカス不良、照明の不足などが考えられます。

例えば、紙に印刷されたバーコードが擦れていたり、汚れていると読み取りに失敗することがあります。

また、カメラのピントが合っていない場合や、環境光が不足していると、バーコードを正確に読み取ることができません。

対処法としては、次のような手段が考えられます。

  1. バーコードの品質を向上させる。印刷時の解像度を上げる、汚れや傷を防ぐための処理を行うなどの方法があります。
  2. カメラのフォーカスを自動で合わせる機能を利用する。
  3. 照明を十分に確保する。外部のライトを利用する、または読み取り時のフラッシュ機能を活用する。

このような方法で、読み取り失敗のリスクを低減することができます。

○バッテリー消費の最適化

バーコード読み取りアプリは、カメラを連続して使用するため、バッテリーの消費が激しいという問題があります。

特に、長時間の使用が予想される場面では、この問題は深刻となります。

対処法として、次の手段が考えられます。

  1. バーコード読み取り時のみカメラを起動し、それ以外の時間はカメラをオフにする。
  2. 低解像度モードでの読み取りをサポートすることで、処理量を減少させる。
  3. バックグラウンドでの不要な処理をオフにする。
// カメラのオンオフ制御のサンプルコード
val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraId = cameraManager.cameraIdList[0]

cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
    override fun onOpened(camera: CameraDevice) {
        // カメラを使用する処理
    }

    override fun onDisconnected(camera: CameraDevice) {
        camera.close()
    }

    override fun onError(camera: CameraDevice, error: Int) {
        camera.close()
    }
}, null)

このコードでは、カメラの起動と終了を制御しています。

読み取りが必要な時だけカメラを起動し、それ以外の時はオフにすることで、バッテリーの消費を抑えることができます。

●Kotlinでのバーコード読み取りをマスターする

Kotlinを使ってAndroidのバーコード読み取りを実装する場合、高度な技術やカスタマイズが可能です。

ここでは、より深い知識と実践的な技術を身につけるための方法を2つのサンプルコードを交えて解説します。

○サンプルコード11:エラーハンドリングの実装

バーコード読み取り時には様々なエラーが発生する可能性があります。

例えば、カメラのアクセスエラーや、不正なバーコードフォーマットなどです。

これらのエラーを適切にハンドリングすることで、ユーザーエクスペリエンスを向上させることができます。

ここでは、Kotlinでのバーコード読み取り時のエラーハンドリングのサンプルコードを紹介します。

try {
    // バーコード読み取り処理
    readBarcode()
} catch (e: CameraAccessException) {
    // カメラアクセスエラーのハンドリング
    showToast("カメラへのアクセスに失敗しました。")
} catch (e: InvalidBarcodeFormatException) {
    // 不正なバーコードフォーマットのハンドリング
    showToast("正しいバーコードをスキャンしてください。")
}

fun showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

このコードでは、readBarcode()関数内で発生するエラーをキャッチし、それぞれのエラータイプに応じたメッセージをトースト表示しています。

○サンプルコード12:バーコード生成機能の追加

バーコードを読み取るだけでなく、アプリ内で新たにバーコードを生成する機能も有用です。

ユーザーが自分のデータをバーコードとして共有する際などに活用できます。

ここでは、Kotlinでのバーコード生成のサンプルコードを紹介します。

val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap("YourDataHere", BarcodeFormat.QR_CODE, 400, 400)

// 生成されたバーコードをImageViewに表示
imageView.setImageBitmap(bitmap)

このコードでは、BarcodeEncoderを利用してデータからバーコードを生成し、それをImageViewに表示しています。

ここではQRコードフォーマットでの生成を示していますが、他のフォーマットも選択可能です。

まとめ

Kotlinを使ったバーコード読み取り技術は、モダンなAndroidアプリ開発において非常に有効なスキルです。

本ガイドでは、基本的なセットアップから高度なカスタマイズ方法、エラーハンドリング、バーコード生成機能の追加まで、幅広い内容を詳しく解説しました。

初心者から上級者までの読者が、Kotlinでのバーコード読み取りの知識を深め、実際の開発現場での応用力を高めることができる内容となっています。

読み取り技術は常に進化しており、新しいフォーマットやライブラリが登場することも考えられます。

そのため、常に最新の情報や技術動向にアンテナを張り、スキルをアップデートしていくことが大切です。

アプリの品質向上のためには、実際に多くのシチュエーションでテストを行い、エラーハンドリングをしっかりと実装することが不可欠です。

ユーザーの利便性を考慮した開発を心がけ、素晴らしいバーコード読み取りアプリを作成してください。