99

我的步骤:

  • 从 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.
4

18 回答 18

108

步骤

  • 确保设备有 Google Play services APK
  • 安装 Google Play 服务版本。超过 2 个

在此处输入图像描述

  • https://code.google.com/apis/console/创建项目
  • 启用“Google Maps Android API v2” 在此处输入图像描述
  • 在 API 控制台注册项目中的 SHA1(现在,您需要 WRITE 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。

于 2012-12-05T09:09:46.617 回答
36

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

于 2013-09-30T07:24:14.807 回答
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. 清单功能:

您需要此条目,因为地图 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 - 项目 - 清理。

享受!

于 2013-04-22T10:05:47.763 回答
16

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

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

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

于 2012-12-04T06:15:40.363 回答
5

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

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

现在它起作用了。

于 2016-10-17T15:37:22.923 回答
5

我遵循了上面提到的 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文本匹配。

于 2018-01-17T14:58:52.753 回答
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>

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

谢谢..请投票

于 2013-07-26T06:51:05.983 回答
3

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

在清单中:

我正在使用包名称:

com.app.triapp

在应用程序 build.gradle 中:

 defaultConfig {

        applicationId "com.app.live"
    }

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

于 2016-06-29T11:47:10.990 回答
2

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

于 2014-03-21T23:44:05.773 回答
1

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

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

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

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

在此处输入图像描述

于 2020-06-17T18:15:28.223 回答
1

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

于 2016-08-23T07:49:22.863 回答
0

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

于 2015-01-25T09:15:20.187 回答
0

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

于 2013-10-03T16:27:07.847 回答
0

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

于 2013-07-03T08:43:59.307 回答
0

我遇到了同样的问题。

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

于 2017-07-05T20:12:45.940 回答
0

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

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

希望这可以帮助某人。

于 2016-06-02T06:16:24.790 回答
0

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

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

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

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

于 2018-11-02T19:23:51.560 回答