Android GoogleMap Info Window maker.title活用


初投稿になります。
Androidの学習を初めて、3ヶ月目に作成したアプリでつまづいた点をまとめてみました。
Info Windowのmarker.title(日付)を利用する点にポイントを絞っていますので、
コードは抜粋して載せております。

環境

Androide Studio 3.5.3
Android6,9にて動作確認済み

この記事でやること

Realmで保存していた画像を、タップされたマーカーのInfo Windowから日付を受け取り、同じ日付で保存された画像を取り出す。

1.Info Window をタップ

2.保存されていた画像を表示

つまづいた点

Info Windowをタップし、Info Windowに表示されていたコメントのRealmのidを渡す事ができなかった。
解決策として、markerの日付を渡す事が出来るので活用した。

Realmで保存

保存するところだけコードを載せます。
memo.dateTime = Date()にて日付を保存しておきます。

// 添付画像を取得する
val drawable = pictureView.drawable as? BitmapDrawable
// 添付画像が設定されていれば画像を取り出してBASE64エンコードする
val bitmap = drawable?.bitmap
val baos = ByteArrayOutputStream()
if (bitmap != null) {
    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos)
   }
val bitmapString = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT)
                    val memoStr = memoEdit.text?.toString() ?: ""
                    realm.executeTransaction {
                        val maxId = realm.where<Memo>().max("id")
                        val nextId = (maxId?.toLong() ?: 0L) + 1L
                        val memo = realm.createObject<Memo>(nextId)
                        memo.dateTime = Date()
                        memo.lat = lat
                        memo.lng = lng
                        memo.memo = memoStr
                        memo.picture = bitmapString

Info Windowのイベント

setOnInfoWindowClickListenerにてマーカークリックのイベント
marker.titleがマーカーの日付。

override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
        checkPermission()

        var intent = Intent(this, PictureDetailActivity::class.java)
        mMap.apply {
            setOnInfoWindowClickListener { marker ->
                intent.putExtra("marker", marker.title)
                startActivity(intent)
            }
        }
    }

マーカーの日付を受け取り、同じ日付の画像を特定する

Realmで保存している、日付はDATE()型なのでStringへ変換する。
val markertitle = (DateFormat.format("yyyy/MM/dd kk:mm", memo.dateTime).toString())

class PictureDetailActivity : AppCompatActivity() {

    private lateinit var realm: Realm

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_picture_detail)
        realm = Realm.getDefaultInstance()

        val mymapId = intent.getStringExtra("marker")//タップされたマーカーtitle(日付を受け取る)

        val realmResult = realm.where(Memo::class.java)
            .findAll()//タップされたマーカーと保存されている日付と同じものを探す
        for (memo: Memo in realmResult) {
            val markertitle = (DateFormat.format("yyyy/MM/dd kk:mm", memo.dateTime).toString())

            if (mymapId == markertitle) {

                val decodedString = Base64.decode(memo?.picture, Base64.DEFAULT) // 文字列をbase64形式に変更
                val decodeByte = BitmapFactory.decodeByteArray(
                    decodedString,
                    0,
                    decodedString.size
                ) // base64文字列をBitmap形式に変更
                val pictureDrawable = BitmapDrawable(decodeByte) // Bitmap形式の画像をDrawable型に変更
                picturedetailView.setImageDrawable(pictureDrawable)//Drawableに変換したものをセット

            }
        }
    }
}

まとめ

試行錯誤してmarker.titleを活用しました。
GoogleMapを活用したアプリ作成で、Info Windowの参考となる物が少なかったので活用して頂ければと思います。また、初学者ですのでご指摘等頂けると幸いです。

参考

[Maps SDK for Android] 地図にMarkerを置く(その1・基本編)
https://qiita.com/outerlet/items/358088ca702721e1f3c4