公式サイトを参考に、ストレージ アクセス フレームワーク(SAF)を使用する。
ストレージ アクセス フレームワークを使用してファイルを開く | Android Developers
コードはGitHubに載せています。
https://github.com/orimomo/picture-frame-app/tree/master
1. ギャラリーを表示する
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F112818%2F8fdceaad-f371-9809-ed6c-ec26a2245896.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d3a1b4ab06a6b024e4c8ab1c927c1905)
コードと解説
private fun selectPhoto() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "image/*"
}
startActivityForResult(intent, READ_REQUEST_CODE)
}
companion object {
private const val READ_REQUEST_CODE: Int = 42
}
- アプリが
ACTION_OPEN_DOCUMENT
インテントを開始すると、ピッカーが起動し、条件に一致するすべてのドキュメント プロバイダが表示される - カテゴリ(
CATEGORY_OPENABLE
)をインテントに追加すると、結果がフィルタリングされ、画像ファイルなどの開くことができるドキュメントのみが表示される - typeを指定することで結果をさらにフィルタリングし、画像 MIME データタイプのドキュメントのみを表示される
- MIMEとは? → Android で MIME Type 判別
2. 選択された画像をImageViewに表示する
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F112818%2F74d0e53f-dcec-eafc-ffd1-568172af352d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=cd76edd8ef4eb36f39afa00fca8f80c9)
コードと解説
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.imageView)
imageView.setImageBitmap(image)
}
} catch (e: Exception) {
Toast.makeText(this, "エラーが発生しました", Toast.LENGTH_LONG).show()
}
}
}
}
- ユーザーがピッカーでドキュメントを選択すると、
onActivityResult()
が呼び出される- 第一引数
requestCode
は要求コードで、ギャラリーから戻ってきたことを識別する - 第二引数
resultCode
は結果コードで、操作が成功した場合RESULT_OK
が、ユーザーがバックアウトしたり、何らかの理由で失敗したりした場合はRESULT_CANCELED
が返る - 第三引数
resultData
は取得したデータで、選択したドキュメントを指すURIにはresultData.data
でアクセスできる - 参考:startActivityForResultのrequestCodeを理解する - Qiita
- 第一引数
- 画像ファイルからBitmapを生成し、ImageViewにセットする