Google Maps Android API v2授权失败

时间:2012-12-04 05:26:10

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

我的步骤:

  • 从debug.keystore获取SHA1代码
  • 在google apis控制台中创建应用
  • 启用了Google地图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”放入libs

编译后我崩溃了:

  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.

18 个答案:

答案 0 :(得分:99)

<强>步骤

  • 确保该设备具有Google Play服务APK
  • 安装Google Play服务版。超过2

enter image description here

  • https://code.google.com/apis/console/
  • 创建项目
  • 启用“Google Maps Android API v2” enter image description here
  • 在API控制台注册项目中的SHA1(现在,你需要写SHA1;你的.app.package.name )并获取API KEY
  • 将目录ANDROID_SDK_DIR / extras / google / google_play_services / 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地图应用。

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

答案 1 :(得分:34)

同时查看这篇文章:Google Map Android Api V2 Sample Code not working,如果你完全确定你做了正确的步骤,那么按照第二个答案,身份验证被缓存到某个地方,尝试手动卸载应用程序(就像你做的那样正常应用程序)然后再次“运行”项目

答案 2 :(得分:19)

由于我浪费了大量时间让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.清单功能

您需要此条目,因为地图API需要一些图形支持:

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

别担心,99.7%的设备支持此功能。

步骤5.清单库:

添加Google图书馆。

    <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版本,则需要在Activity中添加支持:

import android.support.v4.app.FragmentActivity;

对于地图:要使用的条目包括

xmlns:map="http://schemas.android.com/apk/res-auto"
活动布局中的

(例如LinearLayout)。

在我的情况下,每次我在布局中更改某些内容时都必须清理项目。似乎是一个错误。

第8步:使用Eclipse - 项目 - 清理。

享受!

答案 3 :(得分:16)

您需要使用位于以下位置的库项目: ANDROID-SDK-DIRECTORY /额外/谷歌/ google_play_services / libproject

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

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

答案 4 :(得分:5)

今天我遇到了这个问题。我使用Android Studio 2.1.3,Windows 10.虽然调试它工作正常,但如果我更新到发布模式它不起作用。我清除了所有的proguard条件,更新了,但这不是解决方案。

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

现在它有效。

答案 5 :(得分:4)

我跟随了Gunnar Bernstein上面提到的大多数(如果不是全部)建议,它仍然没有奏效。但是,在我遵循他的建议和以下内容后,它开始起作用了:

  1. 我使用Android Studio的右键单击创建了一个新的MapActivity 选项列表:新 - &gt; Google - &gt; Google地图活动

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

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

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

  5. 注意:通过以这种方式创建API KEY,“凭据”下的“限制”列现在声明为“Android应用”。早些时候,当它没有工作时,专栏列出“Android应用程序,1 API”或类似的东西。我不知道这是否有所不同。 注意:不,这只是意味着我没有为此API密钥选择特定的API(控制台 - &gt; API密钥 - &gt;密钥限制 - &gt; API限制)。

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

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

    已被替换为:

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

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

    注意:build.gradle文件中声明的值 android - &gt; defaultConfig - &gt; applicationId 必须与凭据页面下的包名称文本相匹配。

答案 6 :(得分: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服务库...转到窗口 - &gt; Android sdk manager-&gt;更新Google Play服务...安装它..删除旧版本并保留此版本。从ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

获取此信息

谢谢......请投票

答案 7 :(得分:3)

我通过检查清单和应用build.gradle中的包名称来解决了这个错误。

在清单中:

我使用的包名为:

com.app.triapp

在app build.gradle中:

 defaultConfig {

        applicationId "com.app.live"
    }

com.app.triapp中更改为build.gradle后,解决了我的问题。

答案 8 :(得分:2)

我正在从Google地图的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会缓存安全凭据。

答案 9 :(得分:1)

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

A也有这个错误,你需要: 档案 - &gt;导入 - &gt;现有Android代码进入工作区 - &gt;浏览 - &gt; Android sdks - &gt;额外 - &gt;谷歌 - &gt; google_play_services - &gt; lib_project - &gt; google_play_services_lib,好的。检查项目并完成。

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

enter image description here

答案 12 :(得分:0)

对我来说,一切都可以在仿真器和物理设备上进行。

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

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

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

答案 13 :(得分:0)

我遇到了同样的问题。

如果您为该应用程序的发布版本发布了api。 那个api只适用于发布版本而不适用于调试版本。 因此,请确保您在手机或模拟器中使用发行版。

答案 14 :(得分:0)

我按照Google文档中提供的相同步骤操作,但我收到同样的错误。后来我意识到我正在用我的app.keystore签署我的应用程序,而我用来生成API密钥的SHA密钥是调试密钥。

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

希望这有助于某人。

答案 15 :(得分:0)

您的ECLIPSE可能会更改SHA1 KEY,因此您必须在此处使用新的SHA1密钥重新生成您的Google密钥: https://console.developers.google.com/project/watchful-net-796/apiui/credential 之后,将新密钥复制到清单中并重新加载此google页面,并且您的密钥将会更新,重建您的项目,它将起作用。 P / S:对于我的错误,我删除了.android文件夹,因此eclipse重新生成SHA1。

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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