2

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

https://github.com/dbachelder/MNCMapTest

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

该项目是使用 Android Studio 1.3.1 创建的

这是一个针对跨国公司的“谷歌地图活动”项目。

我所做的唯一改变就是改变

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$4.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 中发挥出色,我有什么遗漏吗?就像在我膨胀包含地图的布局之前请求许可?还是我只是匆匆忙忙,我需要等待更长的时间才能让所有这些都准备好进行测试?

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

更新:现在有一个项目的分支可以工作..这里是差异: https ://github.com/dbachelder/MNCMapTest/pull/1/files

4

3 回答 3

3

为了让地图在 M 中发挥出色,我有什么遗漏吗?

WRITE_EXTERNAL_STORAGE现在是dangerous许可,从 MNC 的 v2 开始。您不仅必须在清单中拥有它,而且还需要在运行时向用户请求它。开发人员预览文档(在某种程度上)涵盖了此过程。

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

就像在我膨胀包含地图的布局之前请求许可?

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

还是我只是匆匆忙忙,我需要等待更长的时间才能让所有这些都准备好进行测试?

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

于 2015-08-13T18:40:18.267 回答
1

在不久的将来更新疲惫的旅行者,我遇到了同样的问题,最终从 MapView 移动到 SupportMapFragment (由于需要延迟初始化 MapView 直到授予外部存储权限,使用 SupportMapFragment 您不必调度生命周期回调)。

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

于 2015-09-03T01:22:18.123 回答
0

我有充分的权威表明,当 M 上线时,这不会成为问题。GPS 将在不久的将来更新为不需要此地图许可,因此您唯一需要为这个问题烦恼的时间是在这个过渡阶段。

于 2015-09-04T16:05:06.720 回答