Google Maps Android API v2授权失败


95

我的步骤:

  • 从debug.keystore获得SHA1代码
  • 在Google API控制台中创建应用
  • 启用了Google Map API v2
  • 输入SHA1; my.package.name
  • 获取API密钥
  • 创建了AndroidManifest文件:

        <permission
                android:name="my.package.name.permission.MAPS_RECEIVE"
                android:protectionLevel="signature"/>
    
        <uses-permission android:name="my.package.name.permission.MAPS_RECEIVE"/>
    
        <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"/>
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    
        <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    
        <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="true">
    
            <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="MY_API_KEY_HERE" />
    
            <activity android:name="MyActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
  • 创建的布局

  • 将“ google-play-services.jar”放到库中

编译后我崩溃了:

  ERROR/AndroidRuntime(10182): FATAL EXCEPTION: main
                java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
                at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
                at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source)
                at android.app.Activity.onCreateView(Activity.java:4716)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
                at android.app.Activity.setContentView(Activity.java:1881)
                at com.example.gm2.MyActivity.onCreate(MyActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5104)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
                at android.app.ActivityThread.access$600(ActivityThread.java:141)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:5039)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                at dalvik.system.NativeStart.main(Native Method)

之后,我将布局更改为:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/map"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

并将MyActivity更改为

  super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    transaction.add(R.id.map, MapFragment.newInstance());           
    transaction.commit();

结果,该应用程序启动了,但是我没有看到地图。

控制台日志:

ERROR/Google Maps Android API(10369): Authorization failure.

1
我的天啊!我总是找不到相同的错误R $ stylable类。现在,我将代码更改为以编程方式实现MapFragment的方式,并且可以正常工作!谢谢!但是您需要按如下所述创建密钥
Informatic0re

Answers:


103

步骤

  • 确保设备具有Google Play服务APK
  • 安装Google Play服务版本。2以上

在此处输入图片说明

  • https://code.google.com/apis/console/创建项目
  • 启用“ Google Maps Android API v2” 在此处输入图片说明
  • 在API控制台中在项目中注册SHA1(现在,您需要写SHA1; your.app.package.name)并获取API密钥
  • 将目录ANDROID_SDK_DIR / extras / google / google_google_plays / libproject / google-play-services_lib复制到项目的根目录
  • 将下一行添加到YOUR_PROJECT / project.properties

android.library.reference.1=google-play-services_lib

  • 将下一行添加到 YOUR_PROJECT/proguard-project.txt

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

现在,您可以使用适用于Android的Google Map API V2创建自己的Google Map应用。

如果您使用最小SDK = 8创建应用程序,请使用android支持库v4 + SupportMapFragment而不是MapFragment。


这些说明不能完成全部工作。我需要从maps API示例应用程序中复制proguard.cfg。只有这样,它才开始起作用。
Yoel Gluschnaider

另外,我注意到签名算法必须为SHA1withRSA,而不能为SHA256withRSA(eclipse为调试密钥创建的默认值)。
Yoel Gluschnaider

1
谢谢!to enable "Google Maps Android API v2" 步骤解决了我的问题。
Johan

1
@YoelGluschnaider:如何将默认算法从SHA256withRSA更改为SHA1withRSA?
桑索什

谢谢!您的想法使我免于使用SupportMapFragment。
伊利亚·科根

35

还要检查一下这篇文章:Google Map Android Api V2示例代码不起作用,如果您完全确定自己做了正确的步骤,然后按照第二个答案进行操作,则身份验证会缓存在某处,请尝试手动卸载该应用程序(就像您使用a正常应用程序),然后再次“运行”项目


6
我不敢相信那只是工作。感谢@Alejandro del Rio :)
phil

我敢打赌,就像我一样,这里有90%的人真的想要这个答案,而不是选定的答案(尽管也有帮助)
Kalisky 2014年

在我的情况下,当我读取Stackoverflow并在日志上显示身份验证错误消息时,更新了缓存(?)。该应用程序运行在while屏幕上,几分钟后加载了地图,没有其他身份验证错误。我想重新安装也可以做到。
约翰

2
对于未来的读者。删除bingen。清理,重建并更新缓存的凭据。
George Daramouskas

20

由于我浪费了很多时间来使API正常工作,因此我将尝试对Map API v2进行逐步验证:

步骤1:申请您的API金钥

如果您不熟悉Google API控制台,请阅读上面Rusfearuth的很好回答。

第2步:检查您的SHA哈希(在这种情况下,我使用eclipse的调试键):

在Windows计算机上,在命令提示符下进入您的用户目录:

C:\Users\you>keytool -list -alias androiddebugkey -keystore .android\debug.keyst
ore -storepass android -keypass android

您将获得类似以下内容的信息:

androiddebugkey, 15.10.2012, PrivateKeyEntry,
Zertifikat-Fingerprint (SHA1): 66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6

然后查看地图活动的包名称,例如com.example.mypackagename

您可以结合使用,并在Google API控制台中检查设置是否正确:

66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6;com.example.mypackagename

您在哪里获得API密钥:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

步骤3.清单元数据

检查元数据是否存在并包含正确的密钥。如果发布您的应用,则需要其他密钥。

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

步骤4.清单功能:

您需要此条目,因为map API需要一些grapics支持:

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

不用担心,有99.7%的设备支持此功能。

步骤5.清单库:

添加谷歌图书馆。

    <uses-library
        android:name="com.google.android.maps"
        android:required="false" /> // This is required if you want your app to start in the emulator. I set it to false also if map is not an essential part of the application.

步骤6.清单权限:

检查软件包名称两次:com.example.yourpackage

<permission
    android:name="com.example.yourpackage.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE" />

添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

以下权限是可选的,如果仅显示地图,则不需要。尽量不要使用它们。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

步骤7.将地图片段包括到您的布局中:

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    class="com.google.android.gms.maps.SupportMapFragment"
    map:cameraTargetLat="47.621120"
    map:cameraTargetLng="-122.349594"
    map:cameraZoom="15" />

如果您的发行版为2.x Android版本,则需要在“活动”中添加支持:

import android.support.v4.app.FragmentActivity;

对于地图:工作条目包括

xmlns:map="http://schemas.android.com/apk/res-auto"

在您的活动布局中(例如LinearLayout)。

就我而言,每次更改布局中的内容时,我都必须清理项目。似乎是一个错误。

步骤8:使用Eclipse-Project-Clean。

请享用!


我正在按照您的步骤操作,但是api密钥出错,任何解决方案?
Hemantvc 2013年

1
为<meta-data android:name =“ com.google.android.maps.v2.API_KEY” +1:android:value =“ AZzaSyDhkhNotUseFullKey49ylKD2bw1HM” />
The-null-

16

您需要使用位于以下位置的库项目:ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

这将解决您的第一个问题。

我不确定您的第二个,但这可能是第一个的副作用。我仍在尝试让地图在我自己的应用程序中运行:)


我将Extras / google / google_google_play_services / libproject / libs / google-play-services.jar复制到MY_PROJECT / libs。
Rusfearuth

那还不够好。您需要使用整个库项目,因为它包含许多资源。在Eclipse中,您可以导入一个新的Android项目,并将其指向libproject目录。然后在您自己的项目的属性中,添加对它的引用。
斯科特·肯尼迪

我不使用Eclipse(使用Idea)
Rusfearuth

我不确定图书馆项目在Idea中的工作方式,但是blogs.jetbrains.com/idea/2010/09/…应该具有该信息。
斯科特·肯尼迪

17
我发现了为什么它不起作用。我打开了Google Map API v2,而不是Google Map Android API v2服务。=(可耻的是我......
Rusfearuth

5

今天我面临这个问题。我使用的是Android Studio 2.1.3,Windows10。在调试时,它可以正常工作,但是如果我更新到发布模式,则它不起作用。我清除了所有proguard条件,并进行了更新,但这不是解决方案。

解决方案与项目结构有关。app \ src \ debug \ res和app \ src \ release \ res之间的google_maps_api.xml文件不同。我做了手动复制粘贴从调试到发布文件夹。

现在可以了。


4

我遵循了上面提到的Gunnar Bernstein的大部分(即使不是全部)建议,但仍然没有奏效。但是,在我遵循他的建议以及以下建议后,它开始起作用:

  1. 我通过使用Android Studio的右键单击选项列表创建了一个新的MapActivity:新建-> Google-> Google Maps Activity

  2. 然后,我打开了自动生成的google_maps_api.xml文件,并使用所述链接创建了新的API KEY。我完成了所有步骤,并将新密钥保存在当前项目下。然后,我删除了旧的注册API密钥,因为不再需要它。

  3. 在清单文件下,我用此新XML文件创建的字符串快捷方式替换了旧的API KEY值 android:value="@string/google_maps_key,而不是直接声明KEY。

  4. 最后,删除新的MapActivity,但保留在该过程中创建的xml文件。

注意:通过以这种方式创建API KEY,“凭据”下的“限制”列现在显示为“ Android应用”。之前,当它不起作用时,该列会显示“ Android apps,1 API”或类似内容。我不知道这是否有所作为。 注意:不,这仅表示我没有为此API密钥选择特定的API(控制台-> API密钥->密钥限制-> API限制)。

注意:看起来像清单文件下的元数据标签:

android:name="com.google.android.maps.v2.API_KEY

已被替换为:

android:name="com.google.android.geo.API_KEY"

我想两者都可以使用,但是从一开始就使用后者更好。

注意:在build.gradle文件中,在android- > defaultConfig-> applicationId下声明的值必须与Credentials页面下的Package name文本匹配。


这正是我所发生的一切,此解决方案修复了来自控制台的警告。离子构建以某种方式改变了它。
太空人

搜索8小时后,我回头并应用此解决方案。Solved!!!
meyasir '18

3

只需将其添加到清单文件中:

**<uses-library android:name="com.google.android.maps" />**

例如...

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name=".California"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

并请更新您的Google Play服务库...转到窗口-> Android SDK管理器->更新Google Play服务...已安装它。删除旧的并保留此一项。从ANDROID-SDK-DIRECTORY / extras / google / google_play_services /获取

谢谢..请投票


3

我通过检查manifest和app中的包名称解决了此错误build.gradle

在清单中:

我使用的软件包名称为:

com.app.triapp

在应用程序build.gradle中:

 defaultConfig {

        applicationId "com.app.live"
    }

改为com.app.triappbuild.gradle,解决了我的问题。


1
非常感谢。您节省了我很多时间。
YeeKhin '16

1
优秀兄弟 我一切正常,而不是这个
Mubashar Javed

2

我正在从Google Maps的V1迁移到V2。我在尝试通过Eclipse运行应用程序时遇到此故障。对我而言,根本原因是使用发布证书密钥库而不是Android调试密钥库,而这是通过Eclipse运行它时使用的。以下命令(OSX / Linux)将为您获取调试密钥库的SHA1密钥:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

如果您使用的是Windows 7,则可以使用以下命令:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

尝试使用新密钥之前,最好从设备上完全卸载应用程序,因为Android会缓存安全证书。


1

“ java.lang.NoClassDefFoundError:com.google.android.gms.R $ styleable”

A也有此错误,您需要:文件->导入->现有Android代码进入工作区->浏览-> Android SDK->其他->谷歌-> google_play_services-> lib_project-> google_play_services_lib并确定。检查项目并完成。

该项目将转到Package Explorer。现在转到您的项目(有错误)->属性-> Android,然后在库中单击添加... google_play_services_lib应该在那里!添加并重试:)


1

我遇到了同样的问题,但事实证明那是因为我创建了两个具有相同SHA-1指纹的几乎不相同的包名称com.bla.bla,而另一个具有相同的SHA-1指纹的映射API密钥com.bla.bla.something


0

我遇到了完全相同的问题,我只需要将MapsApiV2的库项目的SDK设置为Android 2.3.3(API lvl 10)


我不记得这些东西了
Informatic0re

0

我遇到过同样的问题。经过大约两个小时的谷歌搜索,重试,多次重新生成API密钥等。我发现自己在Google APis控制台中启用了错误的服务。我启用了Google Maps API v2服务,但是对于Android Apps,您必须使用Google Maps Android API v2。启用正确的服务后,所有服务便开始工作。



0

我遵循了Google文档中提供的相同步骤,但是遇到了同样的错误。后来我意识到我正在用我的app.keystore对我的应用程序进行签名,而我用来生成API密钥的SHA密钥就是调试密钥。

所以我只是signingConfig signingConfig.genericbuild.gradle文件中删除了,我的地图开始工作正常。

希望这对某人有帮助。


0

我遇到了同样的问题。

如果您为应用程序的发行版发布了api。然后,该api仅适用于发行版,不适用于调试版。因此,请确保您在手机或仿真器中使用发行版。


0

对我来说,一切都在模拟器和物理设备上都可以正常工作。

但是,当我设置第二台计算机在具有更新的API级别的仿真器中调试同一应用程序时,它对我来说不再起作用。

我没有意识到那台机器的指纹已经改变。在设备日志中看到身份验证失败错误日志后,我将Google Developer Console中的指纹与错误消息中的指纹进行了仔细比较。那就是我看到的区别。在将新指纹添加到开发人员控制台(与程序包名称结合使用)后,我的应用程序开始按预期在新系统的仿真器中运行。

因此,如果您设置了新系统,请再次检查指纹!


0
  • 确保SDK for Android在API控制台中启用了地图。
  • 另外,您可能需要添加软件包名称和SHA-1签名证书指纹,以限制完全启用密钥的用法。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.