Android で写真をギャラリー(写真アプリ)に表示されるようにしてみた

西田@大阪@Android修行中です

今回は Android で写真(イメージファイル)をギャラリー(写真アプリ)に表示されるようにしてみました

写真がギャラリーに表示される条件

写真をギャラリーに表示するには Android 10(Q)以降に Environment.getExternalStoragePublicDirectory が使えなくなり、Android 10(Q) 以降と以前で処理を分ける必要があります

Environment | Android Developers

ソース

クラス宣言部分

import android.content.ContentValues
import android.content.Context
import android.graphics.Bitmap
import android.media.MediaScannerConnection
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import java.io.File
import java.io.FileOutputStream

class ImageStore(val context: Context) {
  // コード
}

切り分けるコード

override suspend fun saveToPublish(photoBitmap: Bitmap, name: String) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        saveToPublishWithContentResolver(photoBitmap, name)
    } else {
        saveToPublishWithMediaStore(photoBitmap, name)
    }
}

Android 10(Q) 以降のコード

// Android 10(Q) からの機能を使ったメソッド
private fun saveToPublishWithContentResolver(photoBitmap: Bitmap, name: String) {
    val values = ContentValues().apply {
        put(MediaStore.Images.Media.DISPLAY_NAME, name)
        put(MediaStore.Images.Media.MIME_TYPE, "image/jpg")
    }

    val collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
    val contentResolver = context.contentResolver
    val item = contentResolver.insert(collection, values)!!

    contentResolver.openFileDescriptor(item, "w", null).use {
        FileOutputStream(it!!.fileDescriptor).use { out ->
            photoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
        }
    }
}

Android 10(Q) 未満のコード

// Android 10(Q) より前の機能のみを使ったメソッド
private fun saveToPublishWithMediaStore(photoBitmap: Bitmap, name: String) {
    val file = File(
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
        name
    )

    FileOutputStream(file).use { out ->
        photoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
    }

    MediaScannerConnection.scanFile(
        context,
        arrayOf(file.path),
        arrayOf("image/jpg"),
        null
    )
}

さいごに

この記事が誰かの参考になれば幸いです

参考

https://stackoverflow.com/questions/36042752/download-image-and-store-it-in-gallery-app-in-android https://sites.google.com/site/mobilelyl/tsuika-shi-ta-gazou-wo-gyarari-ni-hyouji-sa-seru-ni-ha https://medium.com/@star_zero/android-q%E3%81%AEscoped-storage%E3%81%AB%E3%82%88%E3%82%8B%E5%A4%89%E6%9B%B4-afe41cde9f35 https://developer.android.com/training/data-storage/files/media?hl=ja https://developer.android.com/reference/android/provider/MediaStore.Images?hl=ja https://gitlab.com/commonsguy/cw-android-q/blob/v0.4/ConferenceVideos/src/main/java/com/commonsware/android/conferencevideos/VideoRepository.kt