【问题标题】:Display permission before activity is loaded在加载活动之前显示权限
【发布时间】:2019-07-31 13:08:02
【问题描述】:

我注意到 Stack Overflow 上的一些海报试图这样做,但我的情况有点不同。我有一个 Login 类,当用户进行身份验证时,我将向他们声明一个 Intent 到我的 NavDrawer 类,该类用作 Main Activity。我正在使用地图片段来显示谷歌地图,但是当用户第一次登录时,蓝点(调用 setMyLocationEnabled = true)不可见。这是由于在加载位置权限请求之前在后台加载了地图。当然,在你授予权限并手动重启应用后,蓝点是可见的,因为权限已经授予。

我正在尝试构建我的逻辑,以便用户登录后,他们必须在地图加载之前授予权限。这样,蓝点就会被启用。

显然这是一个已知的错误:https://issuetracker.google.com/issues/73122459

上面链接中的一个建议是在调用 setContentView 之前在 Activity 中请求权限。我试图这样做,但我的地图仍在后台加载。由于位置是应用程序不可或缺的一部分,我想我可以弹出一个屏幕来阻止显示地图,从而将它们带到他们的设置中。然后当他们返回时,地图将可见。

我喜欢 LimeBike 的做法,它背后有一张透明的地图,所以你仍然可以看到应该在那里的东西。一旦您导航到您的设置并启用位置并返回,他们的地图就会加载并弹出蓝点。有没有人有实现类似的经验?

【问题讨论】:

    标签: android google-maps android-permissions setcontentview


    【解决方案1】:

    如果在授予权限之前首次启动时显示蓝点非常重要 - 为什么不尝试在前一个屏幕上请求权限。就在登录屏幕上。并且不要过早打扰用户 - 在用户成功登录后进行。

    即 1.用户登录 2. 用户停留在登录屏幕上,看到有权限的弹出窗口 3. 接受或拒绝 - 无论哪种方式导航到地图屏幕

    【讨论】:

      【解决方案2】:

      只有在 createview 上的权限成功调用之后,才将该权限代码放入 onstart 中。

      【讨论】:

        【解决方案3】:

        如果您的应用流程允许您在显示MapView 之前请求位置权限,这是最简单的解决方案。您还可以在首次启动时在背景中使用静态地图图像,然后在获得权限请求后切换到带有真实地图的屏幕,具体取决于您需要在那里显示的内容。

        或者,如果您希望或必须在权限请求对话框后面显示MapView,我发现您可以采用两种方法之一重新启动MapView,然后它将正确获取位置更新在“我的位置”层(蓝点)。如果已获得许可,您可以从 onRequestPermissionsResult 执行此操作。

        1。替换 MapView

        我将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 隐藏几秒钟,但我不知道如何监控加载进度,因此它永远不会完美;并且您将冒着在切换之前打断用户操作旧地图的风险。

        2。重启 MapView

        第二种方法类似,但不是创建一个新的MapView,而是重新启动同一个。据我所知,在onDestroy 之后再次调用onCreate 似乎没有不良影响,除了背景出于某种原因暂时变为纯黑色,我发现没有看起来不太好。如果您想尽量减少视觉干扰,它也不允许您对新地图进行任何重叠加载。但是,从代码的角度来看,这似乎是一个稍微简单的解决方案。


        如果您使用MapFragment,也许您可​​以做类似的事情,删除旧片段并动态添加新片段。 (不确定是否可以重复使用;我只测试了MapView。)

        【讨论】:

          猜你喜欢
          • 2014-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多