🤖

OSバージョンを意識せずUriからBitmapを取得する方法

2021/04/14に公開

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