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