Androidアプリからギャラリーに保存されている画像を取得して表示する方法を紹介します。何かとストレージへのアクセスがややこしいAndroidですが、ギャラリーは簡単に利用できるので容易に導入できるのが魅力です。
サンプルアプリ(Kotlin)の前提
GUIとKotlinの紐づけにはviewBindingを使用しています。
またボタンのクリック処理に関しては、リスナクラスを使用しています。
ギャラリーの画像をImageViewに表示するサンプル
ボタンを押すと、ギャラリーが起動し画像を選択し、その画像がアプリ内のImageViewに表示されるサンプルを作成しました。
ギャラリーでは、「フォルダ選択 > 画像選択」と操作したので上画像では一応2枚分表示していますが、スマホによって違うかもしれません。
XML
画像表示用のImageViewとクリックイベント用のButtonを配置してます。
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/ivPickedImage" android:layout_width="200dp" android:layout_height="200dp" /> <Button android:id="@+id/btnPickImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_pickimage" /> </LinearLayout>
Kotlin
Intentを用いてギャラリーを呼び出します。
Intent(Intent.ACTION_PICK)を使えば、アプリ外の共有情報を取得できるようです。今回は画像情報を取得するので、typeで「”image/*”」を指定します。
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) // ボタンのリスナクラスのインスタンス作成 val btnListener = BtnListener() // ボタンにリスナを設定 binding.btnPickImage.setOnClickListener(btnListener) } // リスナクラス(ボタンのタップ処理) private inner class BtnListener: View.OnClickListener{ override fun onClick(v: View){ when(v.id){ // ギャラリーから画像取得 binding.btnPickImage.id ->{ // ギャラリーに遷移するIntentの作成 val intent = Intent(Intent.ACTION_PICK) intent.type = "image/*" // ギャラリーへ遷移 receivePicture.launch(intent) } } } } // ギャラリーから画像受け取り private val receivePicture = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ){ if (it.resultCode == Activity.RESULT_OK){ // 画像を表示(ギャラリーintentから取得) pickedmageUri = it.data?.data binding.ivPickedImage.setImageURI(pickedmageUri) } } }
さいごに
思ったより簡単にできました。
「ギャラリーを参照する」といったようなよく使う機能はちゃんと用意されているのがAndroidのいいところですね。逆にアプリ専用ストレージとかは複雑な気がします。
コメント