Я только что видел это! Посмотрим позже.
аюсь получить снимок GoogleMap (из MapView) в фоновом режиме, вернуть его с обратным вызовом и показать его в ImageView. При этом я стараюсь сделать получение снимка как можно более независимым от макета (поэтому стараюсь не добавлять MapView в макет). Я попытался создать MapView программно с заданным размером, добавить несколько путей и булавок к нему, получить снимок и вернуть его (все подписаны с использованием RxJava), но я получаю следующую ошибку, и приложение закрывается даже без " приложение перестало работать ».
FATAL EXCEPTION: androidmapsapi-Snapshot Process:
com.package.name.debug, PID: 2159
java.lang.IllegalArgumentException: width and height must be > 0
at android.graphics.Bitmap.createBitmap(Bitmap.java:1013)
at android.graphics.Bitmap.createBitmap(Bitmap.java:980)
at android.graphics.Bitmap.createBitmap(Bitmap.java:930)
at android.graphics.Bitmap.createBitmap(Bitmap.java:891)
at com.google.maps.api.android.lib6.impl.ec.b(:com.google.android.gms.DynamiteModulesB@11975940:4)
at com.google.maps.api.android.lib6.impl.bf.run(:com.google.android.gms.DynamiteModulesB@11975940:4)
at java.lang.Thread.run(Thread.java:764)
Вот код для получения снимка
fun bitmapFor(mapData: MapData, specs: Specs): Single<Bitmap?> {
val mapView = MapView(context)
mapView.layoutParams = ViewGroup.LayoutParams(specs.mapWidth, specs.mapHeight)
return mapView.getMap()
.subscribeOn(AndroidSchedulers.mainThread())
.map { googleMap ->
setupMap(googleMap, mapData) // Adds paths and pins
googleMap
}
.flatMap { googleMap ->
googleMap.snapshot(mapData)
}
}
private fun MapView.getMap(): Single<GoogleMap> {
return Single.create { subscriber ->
val handler = Handler(Looper.getMainLooper())
handler.post {
onCreate(null)
onStart()
onResume()
getMapAsync { googleMap ->
subscriber.onSuccess(googleMap)
}
}
}
}
private fun GoogleMap.snapshot(mapData: MapData): Single<Bitmap> {
return Single.create { subscriber ->
snapshot { bitmap ->
saveMap(mapData.hashCode().toString(), bitmap)
subscriber.onSuccess(bitmap)
}
}
}
И в классе UI, я делаю
viewModel.mapProvider
.bitmapFor(map, viewModel.mapData, Specs(map.measuredWidth, map.measuredHeight))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onMap, this::onError) // onMap set's the image bitmap