Google 地图的 MNC 权限问题

Permission issue on MNC with Google Maps

我创建了一个最小示例来演示这个问题中的问题

https://github.com/dbachelder/MNCMapTest

我 运行 在一个真实的应用程序中解决了这个问题,但创建了这个项目来演示最小的例子。

该项目是使用 Android Studio 1.3.1

创建的

这是一个针对跨国公司的 "Google Maps Activity" 项目。

我做的唯一改变是改变

compile 'com.android.support:appcompat-v7:23.+'

compile 'com.android.support:appcompat-v7:22.+'

因为 23.+ 似乎还不存在...(不确定为什么它被项目创建向导使用)

启动时出现此异常。

 Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        at com.google.maps.api.android.lib6.d.t.a(Unknown Source)
        at com.google.maps.api.android.lib6.d.ft.a(Unknown Source)
        at com.google.maps.api.android.lib6.d.aj.a(Unknown Source)
        at com.google.maps.api.android.lib6.d.ai.a(Unknown Source)
        at com.google.android.gms.maps.internal.x.onTransact(SourceFile:107)
        at android.os.Binder.transact(Binder.java:387)
        at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source)
        at com.google.android.gms.dynamic.zza.zzb(Unknown Source)
        at com.google.android.gms.dynamic.zza.zza(Unknown Source)
        at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:924)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1116)
        at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1218)
        at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2170)
        at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:300)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748)
        ... 19 more

如您在清单中所见:

https://github.com/dbachelder/MNCMapTest/blob/master/app/src/main/AndroidManifest.xml

存在问题的权限。

模拟器是运行最新版本的M.

为了让地图在 M 中发挥出色,我是否缺少某些东西?就像在膨胀包含地图的布局之前请求许可一样?还是我只是仓促行事,我需要等待更长的时间才能让所有这些都准备好进行测试?

对于围绕地图构建的应用程序,在启动时必须请求存储权限似乎是一个恼人的限制。

更新: 现在有一个项目的 b运行ch 工作..这是差异: https://github.com/dbachelder/MNCMapTest/pull/1/files

Is there something I am missing to get maps to play nice in M?

从 MNC v2 开始,

WRITE_EXTERNAL_STORAGE 现在是 dangerous 权限。您不仅必须将它包含在清单中,还需要在运行时向用户请求它。 the developer preview documentation.

中(在某种程度上)涵盖了此过程

作为权宜之计,您应该能够进入您应用的“设置”页面并手动打开此权限,但我还没有尝试过。

Like ask for the permission before I inflate the layout containing the map?

是的,在尝试调用任何需要该权限的代码之前,您需要请求(并获得)用户的许可。这可能意味着在您尝试使用 Maps V2 执行任何操作之前。

Or am I just jumping the gun and I need to wait a bit longer for all of this to be ready for testing?

哦,好吧,也可能存在错误,但您的示例应用程序未在运行时请求权限,所以我将从这里开始。

近期为疲惫的旅行者更新,我遇到了同样的问题,最终从MapView移动到SupportMapFragment(由于需要延迟初始化MapView直到外部存储权限被授予,而SupportMapFragment你没有调度生命周期回调)。

这相当简单(由于我们使用子片段管理器,对我们来说有点复杂,但没有什么是不可克服的),除了你必须小心处理片段恢复状态的情况:比如用户授予权限,地图正在显示,后台应用程序转到设置以撤销权限。回到应用程序,框架将恢复旧片段 + UI 状态,因为地图片段之前在 UI 堆栈中,地图片段现在创建并在到达 SupportMapFragment#onCreateView 时崩溃由于没有权限。

我有充分的理由相信,到 M 上线时,这将不是问题。 GPS 将在不久的将来更新为不需要此许可的地图,因此您唯一需要为这个问题烦恼的是在这个过渡阶段。