Base64でエンコードされた画像データを他アプリ等に共有できるようにURIを生成する方法です。
手順
- Base64をデコード
- Bitmap画像を作成
- URIを作成
Base64をデコード
画像データの場合、image/jpeg;base64,
がBase64化した文字列の前についているので除外してデコードします。
※ jpeg
の部分は適宜 png
等に変えてください。
val decodedBytes = Base64.decode(
base64Str.substring(base64Str.indexOf(",") + 1),
Base64.DEFAULT
)
Bitmap画像を作成
デコードしたデータからBitmap画像を作成します。
作成は BitmapFactory
の decodeByteArray
を使用します。
BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
URIを作成
作成したBitmap画像からURIを作成します。
ストレージに画像を保存するので、 AndroidManifestに android.permission.WRITE_EXTERNAL_STORAGE
を追加しておきます。
val bytes = ByteArrayOutputStream()
bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
val path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmapImage, "Title", null)
val uri = Uri.parse(path)
一度もストレージを使用したことがない場合、エラーが発生してしまうのでディレクトリの有無を確認してなければ作成しておきます。
val sdcard = Environment.getExternalStorageDirectory()
if (sdcard != null) {
val mediaDir = File(sdcard, "DCIM/Camera")
if (!mediaDir.exists()) {
mediaDir.mkdirs()
}
}
コード全文
以下に今回使用したコードを載せておきます。
// Base64 to Bitmap
@Throws(IllegalArgumentException::class)
fun convert(base64Str: String): Bitmap {
val decodedBytes = Base64.decode(
base64Str.substring(base64Str.indexOf(",") + 1),
Base64.DEFAULT
)
return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
}
// Bitmap to URI
private fun getImageUri(context: Context, bitmapImage: Bitmap): Uri {
val bytes = ByteArrayOutputStream()
bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
val sdcard = Environment.getExternalStorageDirectory()
if (sdcard != null) {
val mediaDir = File(sdcard, "DCIM/Camera")
if (!mediaDir.exists()) {
mediaDir.mkdirs()
}
}
val path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmapImage, "Title", null)
return Uri.parse(path)
}
こんな感じで呼び出して使用して頂ければと思います。
val uri = getImageUri(applicationContext, convert(base64Str))