繁体   English   中英

Google Maps Android API v2 授权失败

[英]Google Maps Android API v2 Authorization failure

我的步骤:

  • 从 debug.keystore 得到 SHA1 代码
  • 在 google apis 控制台中创建应用程序
  • 启用谷歌地图 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.

步骤

  • 确保设备有 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 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 APIs V2 创建您自己的 Google Map 应用程序。

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

另请查看这篇文章: Google Map Android Api V2 Sample Code not working ,如果您完全确定自己做了正确的步骤,然后按照第二个答案进行操作,身份验证会缓存在某处,请尝试手动卸载应用程序(就像您使用正常应用程序)然后再次“运行”项目

由于我只是浪费了大量时间让 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. 清单库:

添加谷歌图书馆。

    <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 - Project - Clean。

享受!

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

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

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

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

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

现在它起作用了。

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

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

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

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

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

注意:通过以这种方式创建 API KEY,Credentials 下的 Restrictions 列现在显示为“Android 应用程序”。 早些时候,当它不起作用时,该列会指出“Android 应用程序,1 个 API”或类似内容。 我不知道这是否有所作为。 注意:不,这只是意味着我没有为此 API 密钥选择特定的 API(控制台 -> API 密钥 -> 密钥限制 -> API 限制)。

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

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文本匹配。

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

**<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>

并请更新您的谷歌播放服务库...转到窗口-> Android sdk 管理器->更新谷歌播放服务...安装它..删除旧的并保留这个。 从 ANDROID-SDK-DIRECTORY/extras/google/google_play_services/ 获取这个

谢谢..请投票

我通过检查 manifest 和 app build.gradle包名称解决了这个错误。

在清单中:

我使用的包名称为:

com.app.triapp

在应用程序 build.gradle 中:

 defaultConfig {

        applicationId "com.app.live"
    }

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

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

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

A 也有这个错误,你需要:文件 -> 导入 -> 现有的 Android 代码到工作区 -> 浏览 -> Android sdks -> 额外 -> 谷歌 -> google_play_services -> lib_project -> google_play_services_lib 和 OK。 检查项目并完成。

该项目转到包资源管理器。 现在转到您的项目(有错误)-> 属性-> Android 并在库中单击添加... google_play_services_lib 应该在那里! 添加并重试:)

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

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

在此处输入图片说明

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

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

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

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

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

希望这可以帮助某人。

我遇到了同样的问题。

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

对我来说,一切都在模拟器和物理设备上运行。

但是,当我设置第二台机器以在具有较新 API 级别的模拟器中调试同一个应用程序时,它停止工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM