0
1

More than 3 years have passed since last update.

Android GoogleMap Info Window maker.title活用

Posted at

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

環境

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

この記事でやること

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

1.Info Window をタップ
スクリーンショット 2020-04-15 8.53.14.png

2.保存されていた画像を表示
スクリーンショット 2020-04-15 9.39.48.png

つまづいた点

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1