Android 9以前で、アプリから端末の標準写真フォルダ(ギャラリーアプリ)に画像を登録するには、以下の手順を行います。
1. 画像を保存する
まず、画像を保存するためのコードを実装します。たとえば、外部ストレージの「Pictures」フォルダに画像を保存する場合、次のようにします。
val filename = "example_image.jpg"
val picturesDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val file = File(picturesDirectory, filename)
val outputStream: OutputStream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.flush()
outputStream.close()
2. MediaScanner
を使用してギャラリーに画像を登録
保存した画像をギャラリーアプリに認識させるためには、MediaScannerConnection
を使用して画像をスキャンし、メディアデータベースに登録します。
MediaScannerConnection.scanFile(context, arrayOf(file.toString()), null) { path, uri ->
// スキャン完了時に呼び出される
Log.d("MediaScanner", "Scanned $path:")
Log.d("MediaScanner", "-> uri=$uri")
}
このコードは、指定したファイルをスキャンし、標準の写真フォルダ(ギャラリーアプリ)に画像が表示されるようにします。
3. パーミッションのリクエスト
外部ストレージに書き込むためには、以下のパーミッションをAndroidManifest.xml
に追加する必要があります。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
さらに、Android 6.0以降では実行時にパーミッションをリクエストする必要があるため、以下のコードを追加します。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_WRITE_STORAGE)
}
REQUEST_WRITE_STORAGE
は任意のリクエストコードです。
これで、画像を端末の標準写真フォルダ(ギャラリーアプリ)に登録することができます。
補足. Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val file = File(picturesDirectory, filename)
val contentUri: Uri = Uri.fromFile(file)
mediaScanIntent.data = contentUri
sendBroadcast(mediaScanIntent)