MNC与谷歌地图的许可问题

时间:2015-08-13 18:34:38

标签: android google-maps google-maps-android-api-2 android-mnc

我创建了一个简单的示例来演示此问题中的问题

https://github.com/projectkudu/kudu/wiki/Web-jobs#scheduling-a-triggered-webjob

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

该项目是使用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

有问题的许可是有的。

模拟器正在运行最新版本的M。

是否有一些我缺少的东西让地图在M中玩得很好?比如在我膨胀包含地图的布局之前请求许可?或者我只是跳枪,我需要等待一段时间才能准备好进行测试?

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

更新:现在项目的一个分支正常工作..这里是差异: https://github.com/dbachelder/MNCMapTest/blob/master/app/src/main/AndroidManifest.xml

3 个答案:

答案 0 :(得分:3)

  

是否有一些我缺少的东西让地图在M中玩得很好?

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" /> <div class="container"> <div class="form-inline" role="form"> <div id="instructions" ng-repeat="instruction in racing.Instructions" class="row"> <div class="col-sm-12"> <div class="input-group"> <input type="text" name="Description2" ng-model="instruction.Description" class="form-control" /> <span class="input-group-btn" role="group" aria-label="order"> <button type="button" class="btn btn-default"> <span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span> </button> <button ng-click="removeInstruction(instruction)" class="btn btn-default"> <span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span> </button> </span> </div> </div> <div class="col-sm-12"> <div class="input-group"> <input type="text" name="Description" ng-model="instruction.Description" class="form-control" /> <span class="input-group-btn" role="group" aria-label="order"> <button type="button" class="btn btn-default"> <span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span> </button> <button type="button" class="btn btn-default"> <span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span> </button> <button ng-click="removeInstruction(instruction)" class="btn btn-default"> <span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span> </button> </span> </div> </div> <div class="col-sm-12"> <div class="input-group"> <input type="text" name="Description" ng-model="instruction.Description" class="form-control" /> <span class="input-group-btn" role="group" aria-label="order"> <button type="button" class="btn btn-default"> <span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span> </button> <button ng-click="removeInstruction(instruction)" class="btn btn-default"> <span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span> </button> </span> </div> </div> </div> </div> </div>现在是WRITE_EXTERNAL_STORAGE权限,截至MNC第2版。您不仅需要在清单中使用它,还需要在运行时从用户请求它。 the developer preview documentation已经(有些)涵盖了这个过程。

作为权宜之计,您应该可以在“设置”中进入应用程序页面并手动切换此权限,但我还没有尝试过。

  

比如在我给包含地图的布局充气之前请求许可?

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

  

或者我只是跳枪,我需要等待一段时间才能准备好进行测试?

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我有良好的权威,这在M生存时不会成为问题。 GPS将在不久的将来更新为不需要此地图的许可,所以你唯一需要在这个过渡阶段打扰这个问题。