【发布时间】:2018-02-05 11:17:09
【问题描述】:
我正在尝试在后台获取 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
【问题讨论】:
-
如何使用Google Maps Static API,比如this问题?
-
您的
width和height在拍摄快照时变为零。这意味着在拍摄快照之前,您必须首先检查屏幕上是否可见任何布局绑定。 -
@AndriiOmelchenko 这就是我目前使用的,但不幸的是它有一些限制。它限制了 URL 中的字符数,这迫使我降低路径的精度。 @Heisen-Berg 这就是我的想法,我尝试了一些方法来防止这种情况(包括使用
mapView.post并对大小进行硬编码),但没有一个奏效.. -
您的网址中是否使用了encoded pollines?
-
不知道这个,但静态地图的另一个问题是我们希望避免在 URL 中发布坐标,因为数据很敏感。非常感谢您的建议!
标签: android google-maps rx-java android-mapview