前提・実現したいこと
アプリ内からカメラにつなげ、保存ボタンを押した際に
画像をPOSTでGASのスプレッドシートへ送るために、
Base64へ変更できるようなシステムを作っています。
参考書を元に撮影された画像のbitmapデータを取得、
Byte並列へ変換後、Base64へと変更しようとしています。
発生している問題・エラーメッセージ
様々なサイトを参考に書いているのですが、
Base64に変換後の変数に値が入っていません。
Byteに変換後は”[B@5f7de9b”というデータがByte配列へ入っています。
Kotlinでの方法は調べているのですが、どれもBase64変換後は値がないため、
そもそもBitmapのデータ取得から間違っているのでしょうか。
該当のソースコード
kotlin
1//MainActivity3.kt 2 3package com.example.myapplication 4 5import android.R.attr 6import android.annotation.SuppressLint 7import android.content.ContentValues 8import android.content.Intent 9import android.graphics.Bitmap 10import android.graphics.BitmapFactory 11import android.net.Uri 12import android.os.AsyncTask 13import android.os.Build 14import android.os.Bundle 15import android.provider.MediaStore 16import android.telephony.TelephonyManager 17import android.util.Base64 18import android.util.Log 19import android.view.View 20import android.widget.ImageView 21import android.widget.Toast 22import androidx.annotation.RequiresApi 23import androidx.appcompat.app.AppCompatActivity 24import org.json.JSONException 25import java.io.* 26import java.net.HttpURLConnection 27import java.net.MalformedURLException 28import java.net.URL 29import java.text.SimpleDateFormat 30import java.time.LocalDateTime 31import java.util.* 32import java.io.ByteArrayOutputStream 33import android.R.attr.bitmap 34import android.R.attr.bitmap 35 36class MainActivity3 : AppCompatActivity() { 37 private var _imageUri: Uri?= null 38 override fun onCreate(savedInstanceState: Bundle?) { 39 super.onCreate(savedInstanceState) 40 setContentView(R.layout.activity_main3) 41 } 42 43 @SuppressLint("NewApi") 44 @RequiresApi(Build.VERSION_CODES.O) 45 //POSTする変数 46 val time: LocalDateTime = LocalDateTime.now() 47 var image : String ="" 48 49 @RequiresApi(Build.VERSION_CODES.O) 50 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?){ 51 super.onActivityResult(requestCode, resultCode, data) 52 //親クラスの同名メソッドの呼び出し 53 //super.onActivityResult(requestCode, resultCode, data) 54 //カメラアプリからの戻りでかつ撮影成功の場合 55 if(requestCode == 200 && resultCode == RESULT_OK){ 56 //撮影した画像のBitmapデータを取得 57 val bmp: Bitmap? = intent.getParcelableExtra("data") 58 //Byte配列へ変換 59 val stream = ByteArrayOutputStream() 60 if (bmp != null) { 61 bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream) 62 } 63 val byteArray = stream.toByteArray().toString() 64 65 //Base64へ変換 66 image= Base64.encodeToString(byteArray, Base64.DEFAULT) 67 68 //画像を表示するImageViewを取得 69 val ivCamera=findViewById<ImageView>(R.id.ivCamera) 70 //プロパティの画像URIをImageViewに設定 71 ivCamera.setImageURI(_imageUri) 72 } 73 } 74 fun onCameraImageClick(view: View){ 75 //日時データを「yyyyMMddHHmmss」の形式にする 76 val dateFormat= SimpleDateFormat("yyyyMMddHHmmss") 77 //現在の日時データを取得 78 val now= Date() 79 //取得した日時データを「yyyy(ry」形式に整形した文字列の生成 80 val nowStr=dateFormat.format(now) 81 //ストレージに収納する画像のファイル名を生成 82 val fileName="CameraIntentSamplePhoto_${nowStr}.jpg" 83 84 //ContentValuesオブジェクトの作成 85 val values = ContentValues() 86 //画像ファイル名を設定 87 values.put(MediaStore.Images.Media.TITLE, fileName) 88 //画像ファイルの種類を設定 89 values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") 90 91 //ContentResolverを使ってURIおイブジェクトを生成 92 _imageUri=contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values) 93 //Intentオブジェクトを生成 94 val intent= Intent(MediaStore.ACTION_IMAGE_CAPTURE) 95 //Extra情報として_imageUroを設定 96 intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri) 97 //アクティビティを起動 98 startActivityForResult(intent, 200) 99 } 100 101 //HTTPのPOST処理は省略 102 103//Buttonを押したら次の画面へ 104 fun onButtonClick(view: View){ 105 val intent=Intent(this@MainActivity3, MainActivity2::class.java) 106 startActivity(intent) 107 } 108}
試したこと
上記のソースコードに記載したものや下記のように関数を作成して、
変換しようとした。エミュレーターでの動作確認のみ。
private fun encodeImage(bm: Bitmap?): String? { val baos = ByteArrayOutputStream() if (bm != null) { bm.compress(Bitmap.CompressFormat.JPEG, 100, baos) } val b = baos.toByteArray() return Base64.encodeToString(b, Base64.DEFAULT) }
補足情報(FW/ツールのバージョンなど)
Kotlin:203-1.5.31-release-550-AS7717.8