初投稿になります。
Androidの学習を初めて、3ヶ月目に作成したアプリでつまづいた点をまとめてみました。
Info Windowのmarker.title(日付)を利用する点にポイントを絞っていますので、
コードは抜粋して載せております。
#環境
Androide Studio 3.5.3
Android6,9にて動作確認済み
#この記事でやること
Realmで保存していた画像を、タップされたマーカーのInfo Windowから日付を受け取り、同じ日付で保存された画像を取り出す。
#つまづいた点
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