258 Lab アプリ開発日記

Andorid,iOSアプリ開発してます。

【Android】画像保存の際、カメラからの画像か保存されている画像かを選ばせる方法

仕事の方が忙しく、全く書けていませんでした。。

最近は、色々と落ち着いてきて、またアプリ開発の方に着手ができてきました。

先日、MyReviewの機能追加を行いました。 MyReviewは、自身で好きなもののレビュー記録を付けることができるアプリです。 レビュー記録を作成する際、画像を一緒に付けることができます。

play.google.com

以前はカメラの機能が使えなかったのですが、使えるようにしました!

・カメラを起動させて撮影した画像を保存

・予め保存している画像を保存

どちらかを選ばせる様な挙動にしています。

こんな感じです。(画質が粗いですが、アプリ上は問題ありません。)

f:id:dev_258lab:20191006155353g:plain
ギャラリーからかカメラからか選ばせる

流れとしては、以下のイメージです。

  1. ギャラリーからのIntentを生成
  2. カメラ起動のIntentを生成
  3. createChooserメソッドに1と2を渡し、1と2を選ばせる画面を表示

今回はKotlinで書きました。

まずは、Intentの生成

// ギャラリー、カメラのIntentを入れるList
val targets: MutableList<Intent> = mutableListOf()

// ギャラリーのIntent
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "image/*"

targets.add(intent)

// カメラのIntent
val intent2 = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
      addCategory(Intent.CATEGORY_DEFAULT)
      putExtra(MediaStore.EXTRA_OUTPUT, createSaveFileUri())
      }

// ギャラリーとカメラのIntentをListに追加
targets.add(intent2)

val chooserIntent = Intent.createChooser(Intent(), "選択して下さい").apply {
      putExtra(Intent.EXTRA_INITIAL_INTENTS, targets.toTypedArray())
      }

startActivityForResult(chooserIntent, requestCode)

画像が選ばれた後のコールバック処理

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (resultCode == Activity.RESULT_OK) {
        // ここの中で受け取った画像に対して処理する
    }
}

では〜🐶