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版本。 因此,请确保您在手机或模拟器中使用了发行版本。
- Android:将位图转换为inputstream
- Android的EditText提示
- 在Android Studio中导入drawable的快速方法?
- “onMenuItemSelected”和“onOptionsItemSelected”之间的区别
- 使用Google Services 3.0.0和build.gradle中的Maps API密钥丢失api_key /当前密钥
- 所有的标准Android图标资源在哪里?
- 匹配文件扩展名的pathPattern不起作用,如果一个句点存在于文件名的其他地方?
- Android设备作为A2DPconfiguration文件的接收者
- Android LocationClient类已弃用,但在文档中使用