質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

1回答

3485閲覧

BitmapデータからBase64へ変換

Sora_M

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/10/18 10:36

前提・実現したいこと

アプリ内からカメラにつなげ、保存ボタンを押した際に
画像を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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/10/18 20:25

https://developer.android.com/training/camera/photobasics?hl=ja には、 > 注: "data" を使用して取得したサムネイル画像は、アイコンには適しているかもしれませんが、それ以上のものではないでしょう。フルサイズの画像を扱うにはもう少し手間がかかります。 とありますが、大丈夫でしょうか?
Sora_M

2021/10/19 01:21

ご質問ありがとうございます. その点は完全に見落としていました. 出来ればフルサイズの画像を扱いたいため,フルサイズで取得できないか調べて見ます. ありがとうございます.
guest

回答1

0

val byteArray = stream.toByteArray().toString()

byteArray にはバイト配列を入れるのですよね?
最後の ".toString()" は要らないのでは。

投稿2021/10/18 11:31

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sora_M

2021/10/18 11:43

ご指摘ありがとうございます。 正しくは、 val byteArray = stream.toByteArray().toString() でした。 ただ、そこを直してもimageの中にBase64変換後の値が入りません。
jimbe

2021/10/18 13:17

> 正しくは、~ いえ、それでは変わっていませんが・・・。 val byteArray = stream.toByteArray() となるべきではないでしょうか。
Sora_M

2021/10/19 01:23

失礼いたしました. コピーしたものを間違っていました. ただ,ソースコードの方は val byteArray = stream.toByteArray() と修正してありますが,結果は変わらずです.
jimbe

2021/10/19 03:46

では、 > そもそもBitmapのデータ取得から間違っているのでしょうか。 とおっしゃられていますように、 > val bmp: Bitmap? = intent.getParcelableExtra("data") で bmp に実際のデータは入っているのは確認済みでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問