🤖
OSバージョンを意識せずUriからBitmapを取得する方法
AndroidでUriからBitmapを取得するとき、MediaStore.Images.Media.getBitmap(ContentResolver, Uri)を使っているかと思いますが、このメソッドはAPI Level 29からdeprecatedになっています。
公式ドキュメントにも記載のある通り、API Level 29以降ではImageDecoder#createSource(ContentResolver, Uri)とImageDecoder#decodeBitmap(Source)を使ってUriからBitmapを取得することになるかと思いますが、OSバージョンの分岐処理を毎回書くのは大変なので、以下のような拡張関数を定義しておくと便利そうです。
fun Uri.getBitmapOrNull(contentResolver: ContentResolver): Bitmap? {
return kotlin.runCatching {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val source = ImageDecoder.createSource(contentResolver, this)
ImageDecoder.decodeBitmap(source)
} else {
MediaStore.Images.Media.getBitmap(contentResolver, this)
}
}.getOrNull()
}
Discussion