Android Studio で QRコード認識アプリを作成する
はじめに
Android Studio で簡単なサンプルアプリを作成しようと思います。
環境構築
Kotolin
Kotolin(コトリン)は2011年に開発された Java 仮想マシン(JVM)で動作するオブジェクト指向のプログラミング言語です。2017年には Google が Android Developer 言語として公式に採用したことで普及が加速しました(といっても、Android 開発以外ではなかなか見かけません)。Kotolin と Java は 100% の互換性があることから、Java からの移行もスムーズに行うことができます。
Gradle
Java 向けに開発されたビルドツールで、JVM で実行されるものです。
Android Studio について
Android Studio は Android アプリケーション開発の統合環境で、ソースコードの編集からビルド、デプロイまでを一気通貫で行うことができるツールです。
プロジェクト
今回は Empty Views Acrtivity を使用します。
作成すると、Gradle のダウンロード、ビルドなどの処理が走ります。しばらくすると、Andrdoid ビューを使用することができるようになります。左側に表示されているのが Android ビューで、「Android v」と表示されているボタンを押すとその他の表示形式になります。
app ディレクトリ
どのようなプロジェクトのテンプレートを使用するかでディレクトリ構成も変わってきますが、今回の Empty Views Acrtivity プロジェクトを例に、app
ディレクトリ以下について説明します。
manifests
アプリ共通の設定ファイルである AndroidManifest.xml
が配置されているディレクトリです。パーミッションの定義などアプリ全体の機能に関わる設定を記入しておくファイルです。
kotolin+java
Kotolin のソースコードが配置されています。
res
アプリのアイコン、画像、画面レイアウト、文字列などの resource が配置されています。
- drawable : 画像などを配置
- layout : レイアウトに関するファイルを配置
- mipmap : アイコンなどを配置
- values : 色、テーマなどの値を配置
- xml : 各種 XML を配置
アプリケーション作成
ビルドファイルの修正
必要なライブラリをインストールするためにビルドファイルを修正します。Android ビューでは2種類の build.gradle.kts
がありますが、これらは配置場所が異なっているものです。Project ビューで見てみると配置されている場所が異なっていることが分かるかと思います。
今回は SampleApp/app/build.gradle.kts
を以下のように修正します[1]。
CameraX
CameraX は Android Jetpack のライブラリで、アプリケーションにカメラ機能を簡単に追加することができるようになります。
以下の依存関係を追加します(公式Ref)。
val camerax_version = "1.4.0-alpha04"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-camera2:${camerax_version}")
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
implementation("androidx.camera:camera-video:${camerax_version}")
implementation("androidx.camera:camera-view:${camerax_version}")
implementation("androidx.camera:camera-mlkit-vision:${camerax_version}")
implementation("androidx.camera:camera-extensions:${camerax_version}")
今回は「Version Catalog を使いなさい」と lint warning が出ていますが、一旦このままで作業を進めます。
レイアウト
res/layout/activity_main.xml
を開いて UI 画面の編集を行います。Android Studio 上では実際の UI を確認しながら開発を進めることができます。このレイアウトファイル activity_main.xml
は実際の処理を記述しているファイルと紐づいています。
コード
今回すべてのロジックは MainActivity.kt
に実装します。
Activity
Android アプリ画面のことを指します。Activity は activity_main.xml
でレイアウトを定義し、MainActivity.kt
で機能を定義するような形式で、二種類のファイルを用いて作成されます。
Acrtivity の状態遷移を実現するために、Activity
クラスからコールバックが提供されています:
-
onCreate
: Activity 生成時(画面を立ち上げた時)に一度だけ呼び出される( コンストラクタ)\simeq -
onStart
: 開始の状態になると呼び出される -
onResume
: onStart に続く処理を実装し、Activity を表示可能な状態にするための処理を実装する -
onPause
: アプリがバックグラウンドに移動した際に呼び出される -
onStop
: 完全にバックグラウンドに移動した際に呼び出される -
onRestart
: Activity 再表示の際に呼び出される -
onDestroy
: 破棄される直前に呼び出される
View
ボタンやテキストボックスなどのパーツを View と呼びます。
Fragment
Fragment とはコンテンツとライフサイクルを持った View で、Activity の上に積み重ねる形で使用します。View はライフサイクルを持っていないため、Activity (画面)と連動する処理を実装するのは View 単体では困難です。例えば Fragment を用いることで Tab 機能などを簡単に実装することができるようになります。
ViewBinding
Android 開発ではレイアウト用の XML と Kotolin のソースが別々で、それらを id
を適切に割り当てることで対応付を行っていきます。その際に Kotolin であれば ViewBinding と呼ばれる手法を用いることができます(Developers)[2]。
ViewBinding を有効にすると、XML レイアウトファイル毎に自動でバインディングクラスが生成されます。例えば res/layout/activity_main.xml
というファイルに対してキャメルケース + Binding.java
という命名規則に従った新しいファイルが作成されます(今回であれば ActivityMainBinding.java
)。
Activity で ViewBinding を使用する場合は onCreate()
メソッドの中で以下の定義を行っていきます
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewBinding を使用する場合の処理
// inflate() メソッドを呼び出し、使用するバインディングクラスのインスタンスを作成する
binding = ActivityMainBinding.inflate(layoutInflater)
// ルートビューへの参照を取得する
val view = binding.root
// 画面上のアクティブビューに設定する
setContentView(view)
}
XML レイアウトファイルで以下の定義がされている場合
<Button
android:id="@+id/image_capture_button"
...
/>
image_capture_button
がキャメルケースになった imageCaptureButton
という ID として参照することができるようになります。以下の例だと、ボタン押下時に(適宜別で)定義しておいた customFunction
が実行されるような設定をしています。
binding.imageCaptureButton.setOnClickListener { customFunction() }
Discussion