Google地图Android API v2授权失败

我的步骤:

  • 从debug.keystore获得SHA1代码
  • 在Google apis控制台中创build应用
  • 启用谷歌地图api v2
  • inputSHA1; my.package.name
  • 获取API密钥
  • 创buildAndroidManifest文件:

    <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> 
  • 创build布局

  • 把“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. 

步骤

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

在这里输入图像描述

  • 通过https://code.google.com/apis/console/创build项目;
  • 启用“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地图API V2创build自己的Google地图应用。

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

另外检查这篇文章: 谷歌地图Android Api V2示例代码不工作 ,如果你完全确定你做了正确的步骤,然后按照第二个答案,身份validation获取caching的地方,尝试手动卸载应用程序(就像你做一个正常的应用程序),然后再次运行该项目

由于我只是浪费了很多时间让API工作,我将尝试对Map API v2进行一步一步的validation:

第1步:申请您的API密钥

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

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

在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步。清单function:

您需要此条目,因为地图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版本,则需要在您的活动中添加支持:

 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.虽然debugging它工作正常,但如果我更新到释放模式,它不起作用。 我清除了所有的proguard条件,更新,但这不是解决scheme。

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

现在起作用了。

我通过检查清单和应用程序build.gradle包名解决了这个错误。

在清单中:

我正在使用一个包名称:

 com.app.triapp 

在应用程序build.gradle:

  defaultConfig { applicationId "com.app.live" } 

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

我正在从Google地图的V1迁移到V2。 我正在尝试通过Eclipse运行应用程序。 我的根本原因是使用我的发行证书密钥库,而不是通过Eclipse运行时使用的Androiddebugging密钥库。 以下命令(OSX / Linux)将为您提供debugging密钥库的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 

在尝试使用新密钥作为Androidcaching安全证书之前,最好从您的设备上彻底卸载您的应用。

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

也有这个错误,你需要:文件 – >导入 – >现有的Android代码到工作区 – >浏览 – > Android SDK – >演员 – >谷歌 – >谷歌播放服务 – > lib_project – >谷歌播放服务_lib和确定。 检查项目并完成。

该项目转到包资源pipe理器。 现在转到您的项目(错误) – >属性 – > Android和库中单击添加… google_play_services_lib应该在那里! 添加并再试一次:)

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

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

谢谢..请投票

我有同样的问题,但事实certificate,这是因为我创build了两个不同的地图API密钥具有相同的SHA-1指纹与几乎相似的包名com.bla.bla和其他com.bla.bla.something

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

我遇到过同样的问题。 经过两个小时的谷歌search,重试,重新生成API密钥等等,我发现我在Google APis Console中启用了错误的服务。 我启用了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然后,复制新密钥进入清单和重新加载这个谷歌网页有些时候,你的关键将被更新,重build你的项目,它将工作。 P / S:对于我的错误,我删除.android文件夹,所以eclipse regen SHA1。

我遵循了Google Doc提供的相同步骤,但是我得到了同样的错误。 后来我意识到我正在用我的app.keystore签名我的应用程序,并且我用来生成API密钥的SHA密钥是debugging密钥。

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

希望这有助于某人。

我面临同样的问题。

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