我注意到Stack Overflow上有一些张贴者试图这样做,但是我的情况有所不同。我有一个Login类,当用户进行身份验证时,我向NavDrawer类声明了一个向他们的意图,该类用作Main Activity。我正在使用地图片段显示Google地图,但是当用户首次登录时,蓝点(调用setMyLocationEnabled = true)不可见。这是由于在加载位置权限请求之前在后台加载了地图。当然,在授予权限并手动重新启动应用程序之后,由于已授予权限,因此蓝点可见。
我正在尝试建立自己的逻辑,以便用户登录后,他们必须先授予权限,然后地图才能加载。这样,蓝点将被启用。
显然这是一个已知的错误:https://issuetracker.google.com/issues/73122459
上面链接中的一个建议是在调用setContentView之前在Activity中请求权限。我试图这样做,但是我的地图仍在后台加载。由于位置是应用程序不可或缺的部分,因此我想我可以抛出一个阻止显示地图的屏幕,然后将其转到设置中。然后,当他们返回时,地图将可见。
我喜欢LimeBike的工作方式,并在其后有透明地图,因此您仍然会看到那里应该有的东西。导航到设置并启用位置并返回后,将加载其地图,并弹出蓝点。有没有人有实现类似东西的经验?
答案 0 :(得分:0)
如果在授予权限之前首次启动时显示蓝点非常必要-为什么不尝试在先前的屏幕上请求权限。在登录屏幕上。为了避免过早打扰用户-请在用户成功登录后进行操作。
即 1.用户登录 2.用户停留在“登录”屏幕上,看到具有权限的弹出窗口 3.接受或拒绝-两种方式均可导航到“地图”屏幕
答案 1 :(得分:0)
仅在权限成功调用createview之后,才将权限代码放入onstart中。
答案 2 :(得分:0)
如果您的应用流程允许您在显示MapView
之前请求 的位置许可,那是最简单的解决方案。您可能还可以在首次启动时在后台使用静态地图图像,然后在权限请求后根据实际显示情况切换到带有真实地图的屏幕。
或者,如果您希望或必须在权限请求对话框后看到MapView
,我发现您可以采用两种方法之一来重新启动MapView
,随后它将重启在“我的位置”图层(蓝点)中正确获取位置更新。如果已授予许可,请从onRequestPermissionsResult
执行此操作。
我将MapView
本身放在了FrameLayout
中。首先保存现有MapView
的状态,然后将其关闭:
val oldMapState = Bundle()
with(mapView) {
onSaveInstanceState(oldMapState)
onPause()
onStop()
onDestroy()
}
然后创建一个新的MapView
,将其运行到“恢复”状态,并将其交换到FrameLayout中,以代替旧的地图视图:
val mapContainer = branchMapView.parent as FrameLayout
val newBranchMapView = MapView(mapContainer.context).apply {
onCreate(oldMapState)
getMapAsync { it.isMyLocationEnabled = true }
onStart()
onResume()
}
在加载新的MapView
时会有一闪的背景,但是我没有发现它太麻烦。在加载新的MapView
的同时,人们可能会进一步完善它以隐藏几秒钟,但是我不知道一种监视加载进度的方法,因此它永远都不是完美的。并且冒着在切换之前中断用户操作旧地图的风险。
第二种方法类似,但是我们没有重新创建新的MapView
,而是重新启动了相同的方法。据我所知,在onCreate
似乎没有不良影响之后,再次致电onDestroy
,除了,由于某种原因,背景暂时变黑了,我发现效果不佳。如果您想尽量减少视觉干扰,它也不允许您对新地图进行任何重叠的加载。但是,从代码角度来看,这似乎是一个稍微简单的解决方案。
如果您使用的是MapFragment
,也许您可以做类似的事情,删除旧片段,然后动态添加新片段。 (不确定是否可以重复使用;我仅使用MapView
进行了测试。)