開発未経験がKotlinでAndroidアプリを作ってみた！〜カメラ制御と文字認識の実装奮闘記〜


こんにちは！

前回こちらの記事を投稿しました。

https://qiita.com/ararrararararaarrrr/items/5e28201b9e453150fd5b

今回はカメラ制御にCameraX、文字認識にML Kitを使用したアプリの開発過程で遭遇した困難と、その解決策を初心者なりに紹介できたらと思います。

## はじめに

今回開発したのは、カメラで電話番号を認識し、即座に検索できるアプリです。固定電話にかかってくる不審な番号を、素早く調べられるようにしたいと考えました。

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

まず、Android Studioのインストールから始めました。
公式サイトからダウンロードし、インストールしましたが、初めて見る画面の数々に戸惑いました。
参考にしたのは、Android Developers公式サイトです：

https://developer.android.com/studio

## プロジェクトの作成と初期設定

Android Studioでプロジェクトを作成し、Kotlinを選択しました。
ここで最初の躓きがありました。Gradle、AndroidManifest、drawableなど、見慣れない用語や設定ファイルの山に圧倒されました。
特にGradleの設定は難しく感じました。
必要なライブラリを追加するため、build.gradleファイルを編集する必要がありました。

```AndroidManifest.xml
dependencies {
    implementation ("androidx.camera:camera-camera2:1.3.3")
    implementation ("androidx.camera:camera-lifecycle:1.3.3")
    implementation ("androidx.camera:camera-view:1.3.3")
    implementation ("com.google.mlkit:text-recognition:16.0.0")
}
```


## カメラ機能の実装

カメラ機能の実装には、CameraXを使用しました。しかし、カメラのプレビューを表示するだけでも一苦労でした。まず、AndroidManifestファイルにカメラの使用許可を追加する必要がありました：

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

次に、CameraXの初期化とプレビューの設定を行いました：

```CameraPreview.kt
private fun startCamera() {
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    cameraProviderFuture.addListener({
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
        val preview = Preview.Builder()
            .build()
            .also {
                it.setSurfaceProvider(viewFinder.surfaceProvider)
            }

        try {
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(
                this, CameraSelector.DEFAULT_BACK_CAMERA, preview)
        } catch(exc: Exception) {
            Log.e(TAG, "カメラのバインドに失敗しました", exc)
        }
    }, ContextCompat.getMainExecutor(this))
}
```

このコードを理解し、正しく実装するまでに何度も試行錯誤しました。
参考にしたのは、Android Developers公式のCameraXのガイドです：

https://developer.android.com/training/camerax

## 文字認識機能の実装

文字認識にはML Kitを使用しました。
カメラのプレビューから画像を取得し、それを文字認識にかけるプロセスが特に難しかったです。以下は、文字認識を行う関数の一部です：

```TextRecognition.kt
private fun recognizeText(image: InputImage) {
    val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
    recognizer.process(image)
        .addOnSuccessListener { visionText ->
            processTextRecognitionResult(visionText)
        }
        .addOnFailureListener { e ->
            Log.e(TAG, "文字認識に失敗しました: $e")
        }
}
```

この実装には、ML Kitの公式ドキュメントが非常に役立ちました：

https://developers.google.com/ml-kit/vision/text-recognition

## レイアウトファイルの作成

XMLでのレイアウト作成も初心者には難しいものでした。
特に、カメラのプレビューを表示するためのViewFinderの配置に苦労しました：

```activity_camera.xml
<androidx.camera.view.PreviewView
    android:id="@+id/viewFinder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

レイアウトの作成には、以下のQiita記事が参考になりました：

https://qiita.com/AAkira/items/02814f337f4eb2d30f2e


## 完成したアプリの紹介

カメラで電話番号を認識し、即座に検索できる機能を実現できました。さらに、認識した番号の履歴保存や、アプリ内での迷惑電話としての登録機能も追加しています。

固定電話にかかってくる不審な電話番号に悩まされている方、ぜひ一度お試しください！
アプリは以下のリンクからダウンロードできます：

https://play.google.com/store/apps/details?id=com.company.phonenumberOCR

## おわりに

最後まで読んでいただき、ありがとうございました。
アプリの改善点や新機能のアイデアがありましたら、ぜひGoogle Playのレビューでお聞かせください。
これからもアプリの改良を続けていきます！