この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
西田@大阪@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