map使用 - Google Maps Android API v2授权失败




mapbox (11)

我的步骤:

  • 从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”放到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.

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

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

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


步骤

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

  • 通过https://code.google.com/apis/console/创建项目
  • 启用“Google Maps Android API v2”
  • 在APIs控制台上注册项目中的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创建自己的Google地图应用。

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


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


只需将它添加到你的清单文件中:

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

谢谢..请投票


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

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

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


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


我正在从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缓存安全证书之前,最好从您的设备上彻底卸载您的应用。


我通过检查清单和应用程序build.gradle软件包名称来解决此错误。

在清单中:

我正在使用一个包名称:

com.app.triapp

在应用程序build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

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


我遵循Google文档中提供的同一步骤,但是我收到了同样的错误。 后来我意识到我用我的app.keystore签署了我的应用程序,并且我用来生成API密钥的SHA密钥是调试密钥。

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

希望这可以帮助某人。


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

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

  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下的限制列现在称为“Android应用程序”。 此前,当它没有工作时,专栏中提到“Android应用程序,1 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名称文本相匹配。


由于我只是浪费了很多时间让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版本,则需要在您的活动中添加支持:

import android.support.v4.app.FragmentActivity;

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

xmlns:map="http://schemas.android.com/apk/res-auto"

在你的活动布局(例如LinearLayout)中。

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

第8步:使用Eclipse - Project - Clean。

请享用!





google-maps-android-api-2