はじめに
Qiita初投稿のシェンリー(@schenlybiz)です。現在、フリーランスで活動しています。
Androidアプリを初めて開発して、2018年11月上旬にシームレス・コラージュ(以降は本アプリとします)をリリースすることができました。
OpenCVを利用したシームレス画像合成のAndroidアプリで、2018年8月中旬頃に開始しましたが、技術不足とAndroidの画面遷移(フラグメント)、カメラ機能に関する処理、画像に関する処理などでハマった点が多くありました。(開発期間は学習コスト含む)
これらのハマった点を共有することで、多くの開発者の時間短縮に貢献できたらと思い公開することにしました。
技術不足
Androidアプリ及びOpenCVが初めてだったこともあり、Android Studioの新規プロジェクトとしてOpenCVのサンプルをビルドしようとした際はエラーの連続でした。
リリース直前では、Gradleのビルド・バリアントやプロダクトフレーバーの設定でデバッグ(テスト)用とリリース用のリソースやビルドを簡単に切り替えられることを覚えました。
これらは、同様のトラブルを経験した人が、Qiitaを筆頭に情報を公開しているおかげでハマることはありませんでした。
Androidアプリは初めてとはいえ、Java 1.2の時代から経験している私としては、Javaで開発するよりも互換性のあるKotlinで開発する方が何倍もメリットを感じました。
Kotlinに関しても公式ドキュメント、書籍やサイトの技術情報が公開されているおかげでJavaよりもコーディングの効率が向上しています。
公式ドキュメントといえば、Androidの公式ドキュメントは古い情報が混じっていたため、多少混乱しました。
対象者
- Androidアプリに興味がある方
- Androidの画面遷移(フラグメント)処理を組み込む方
- Androidのカメラ機能に関する処理を組み込む方
- Androidの画像に関する処理を組み込む方
- Androidの画面遷移(フラグメント)処理でハマっている方
- Androidのカメラ機能に関する処理でハマっている方
- Androidの画像に関する処理でハマっている方
実行環境
【課題発生時の実行環境】
Android Studio 3.1.4
[build.gradle](プロジェクト)
com.android.tools.build:gradle:3.1.4
org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.61
[build.gradle](モジュール:app)
minSdkVersion 19(API 19/Android 4.4/KitKat)
(保持している端末のバージョンがAndroid 4.4のため)
compileSdkVersion 27(API 27/Android 8.1/Oreo)
targetSdkVersion 27
【リリース時の実行環境】
Android Studio 3.2.1
[build.gradle](プロジェクト)
com.android.tools.build:gradle:3.2.1
org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0
[build.gradle](モジュール:app)
minSdkVersion 19(API 19/Android 4.4/KitKat)
(保持している端末のバージョンがAndroid 4.4のため)
compileSdkVersion 28(API 28/Android 9.0/Pie)
targetSdkVersion 28(API 28/Android 9.0/Pie)
【利用したOpenSource】
Android-Image-Cropper 2.7.0
lottie-android 2.5.0
OpenCV 3.4.3
前提条件
今回の開発中の調査でAndroidのマテリアルデザイン、Android Jetpack、ReactiveX/RxJava/RxAndroidの存在を知りましたが、本アプリ(Fragment除く)では利用していません。(本アプリのリリースを優先したのと余裕がなかったことが要因です)
目次
1.Androidの画面遷移(フラグメント)処理
- 1.1 画面遷移後のイメージ画像を貼り付ける処理
- 1.2 画面遷移後のシームレス画像合成中のアニメーション画像表示処理
- 1.3 シームレス合成結果画面上のバックスタック処理
2.Androidのカメラ機能に関する処理
- 2.1 画像選択時のギャラリー又はカメラ機能を選択するChooser処理
- 2.2 Chooserのカメラ機能に他カメラアプリを除外する処理
- 2.3 カメラ撮影時のonActivityResult()のIntentパラメータ処理
3.Androidの画像に関する処理
- 3.1 FileクラスのcreateTempFile(一意なファイル名)処理
- 3.2 OpenCVを利用したイメージ画像のミラー処理
- 3.3 OpenCVを利用したシームレス合成処理
- 3.4 シームレス合成画像のギャラリー登録処理