シヨツ鬼のブログ

初心者向けに分かりやすくIT関連の情報を発信しています。

【Android Studio/kotlin】スマホの内臓画像データを読み込んで表示させる方法【動画解説付き】

f:id:shiyotsuki:20200719204459p:plain

どうも、プログラミングの鬼シヨツ鬼です。

本日はAndroid StudioでKotlinを使って、スマホの内臓画像データを読み込んで表示させる方法を紹介したいと思います。

Androidスマホの写真を使ったアプリを作りたいぞ」

そんなあなたにおすすめの記事です。


ちなみに、僕はAndroidアプリ開発は今月から学び始めた初心者of初心者です。
初心者だからこそ、分からないところがよく分かるので、きっと参考になるはずです(笑)

初心者の方は僕と一緒に頑張っていきましょう!

また、この記事は、次の動画と同じ内容ですので、文章だけだと分かりづらい場合はこちらもご覧ください。
YouTube:【Androidアプリ開発】スマホに保存された画像をアプリで読み込む方法

完成イメージ

こんな感じで、ボタンを押すとギャラリーが開き、選択した画像が表示されるというアプリを作っていきます。
youtu.be

準備

この記事では、Android Studioより新しいプロジェクトをEmptyで作成したところからスタートします。
ここまでの具体的な手順は以下の記事を見てください。

qiita.com

activity_main.xmlを編集する

activity_main.xmlを作成することで、画面の見た目を作っていきます。
こちらはテキストから編集することもできますが、Android Studioを使うとGUIから直感的に作成することができます。
こんな感じにボタンとImage Viewを配置します。
(配置の仕方は動画を見ると分かりやすいと思います。)
f:id:shiyotsuki:20200719122920p:plain

MainActivity.ktを編集する

MainActivity.ktを作成することで、ボタンが押された時の動きを作ることができます。
サンプルプログラムはこんな感じです。

package com.example.hellotest

import android.content.Intent
import android.graphics.BitmapFactory
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast

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

        var pictureButton : Button = findViewById(R.id.button)

        //ボタンが押されたらギャラリーを開く
        pictureButton.setOnClickListener {
            val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
                addCategory(Intent.CATEGORY_OPENABLE)
                type = "image/*"
            }
            startActivityForResult(intent, READ_REQUEST_CODE)
        }

    }

    //READ_REQUEST_CODEの定義
    companion object {
        private const val READ_REQUEST_CODE: Int = 42
    }

    //写真が選択された後の動き
    override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
        super.onActivityResult(requestCode, resultCode, resultData)
        if (resultCode != RESULT_OK) {
            return
        }
        when (requestCode) {
            READ_REQUEST_CODE -> {
                try {
                    resultData?.data?.also { uri ->
                        val inputStream = contentResolver?.openInputStream(uri)
                        val image = BitmapFactory.decodeStream(inputStream)
                        val imageView = findViewById<ImageView>(R.id.imageView2)
                        imageView.setImageBitmap(image)
                    }
                } catch (e: Exception) {
                    Toast.makeText(this, "エラーが発生しました", Toast.LENGTH_LONG).show()
                }
            }
        }
    }
}

intentを作る

ボタンが押されたらギャラリーを開くの中でインテントを作っています。
インテントとは、別のアプリを呼び出す際に使う情報をまとめた箱のようなものです。
今回だとインテントに下記のような情報を詰めています。
・Intent.ACTION_OPEN_DOCUMENT:スマホに保存されているドキュメント(ファイル)を開く
・addCategory(Intent.CATEGORY_OPENABLE):開けるタイプのみに限定
・type = "image/*":画像ファイルのみに限定

作成したインテントをstartActivityForResultで実行することで、画像ファイルのみが見えるフォルダ画面が開きます。

onActivityResult

画像が選択されたら、その情報をonActivityResultで取得します。
onActivityResultの3つの引数は以下の通りです。
・requestCode:どの遷移先から戻ってきたのかを判別する
・resultCode:遷移元の操作が成功したのか判別する
・resultData:取得したデータ

まとめ

自分のスマホで自分の撮った写真が自分の作ったアプリで表示できるのは最高だね!
最後まで読んでくれてありがとう。
参考になったら「☆」を押してね。そして僕のYouTubeTwitterもよろしくね。