ギャラリーから画像/動画を取得する
- 2020.03.24
- Android

まずはインテントを作成
1 2 3 4 5 6 7 8 9 |
// ギャラリー用のIntent作成 val intentGallery: Intent /** * action:ピッカーを使用してファイルを選択する * url:ギャラリー内のデータへアクセスする */ intentGallery = Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI) intentGallery.type = "image/* video/*" (context as Activity).startActivityForResult(intentGallery, 1000) |
簡単に説明していきます。
ACTION_PICK:データからアイテムを選択、そして返す(URI)
参考:https://developer.android.com/reference/android/content/Intent?hl=ja#ACTION_PICK
EXTERNAL_CONTENT_URI:Android内のVideoディレクトリに移動。
MediaStore.Files.getContentUri(“external”)でファイル全般の取得も可能らしいが以下のtypeプロパティで画像と動画の取得ができたので使ってない。
他に使えるuriについて以下に載せときます。
参考:https://android.roof-balcony.com/shori/content-provider/getcontent-3/
typeは指定したuriのMIMEタイプを指定できる。
ここでimageとvideoを指定することでどちらにもアクセスできるようになる。
ちなみにこういったインテントの呼出し方を暗黙的インテントというらしい。
その逆(アクティビティを指定して呼び出す方法)は明示的インテント。
以下が分かりやすい。
参考:https://android.roof-balcony.com/shori/content-provider/getcontent-3/
typeは指定したuriのMIMEタイプを指定できる。
ここでimageとvideoを指定することでどちらにもアクセスできるようになる。
ちなみにこういったインテントの呼出し方を暗黙的インテントというらしい。
その逆(アクティビティを指定して呼び出す方法)は明示的インテント。
参考:Androidの明示的インテント、暗黙的インテント、ブロードキャストインテントについて
startActivityForResult:これによって起動したアクティビティは終了時に起動元のonActivityResultにデータを返します。
また、第2引数に値(requestCode)を指定しているが、これはどのアプリ/機能から呼び出されているかを判別するためのもの。
続いて受け取り側の処理を載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CHOOSER) { if (resultCode != Activity.RESULT_OK) { // キャンセル時 return } val selectedMedia: Uri = (if (data != null) data.data else m_uri) ?: // 取得失敗 return val cr: ContentResolver = context.contentResolver val mime = cr.getType(selectedMedia) val uri = data?.data if (mime!!.toLowerCase().contains("video")) { videoView.setVideoURI(uri); } else if (mime.toLowerCase().contains("image")) { imageView.setImageURI(uri) } } } |
画像か動画かで処理を分けたいのでContentResolverを使ってデータのMIMEタイプから識別をしています。
以下を参考にして書きました。
参考:https://stackoverflow.com/questions/34488921/identify-in-onactivityresult-if-image-was-selected-from-gallery-or-video-was-sel
requestCodeは先ほどstartActivityForResultで指定した値がそのまま返ってきます。
また、resultCodeではRESULT_OKかRESULT_CANCELEDのどちらかが必ず返ってきます。
今回はサンプルとして受け取ったファイルがvideoかimageかでそれぞれ専用のviewに張り付けるようにしています。
-
前の記事
AsyncTaskの備忘録 2020.03.24
-
次の記事
FTPClient(Kotlin) 2020.03.29