Google API 密钥不适用于 Android

Posted

技术标签:

【中文标题】Google API 密钥不适用于 Android【英文标题】:Google API Key not working with Android 【发布时间】:2015-12-09 09:03:33 【问题描述】:

我在我的应用程序中使用 Google API,但只能让调试 ssh 与 Google API 一起工作。 我有一个我签名的密钥库,过去我对以前的应用程序做过同样的事情并且没有问题。我还启用了所有 API。我正在使用发布 apk 签署我的应用程序。我在 SSH1 中使用该版本 apk 中的 SSH1 作为 Google API 凭据。我在我的应用程序中使用来自 Google 的密钥。我已经阅读了所有关于此的堆栈溢出和谷歌文档,并且已经尝试了几乎所有内容,但我无法让它工作。 它仅在我调试我的应用程序时有效(在这种情况下,我使用调试密钥库生成的 SSH1 和我与该 SSH1 一起使用的密钥)。 但是,当我用我的人发布密钥库签名并在应用商店的 Beta 版上发布并下载到我的手机上时,我收到我的 API 密钥无效的错误。如果有帮助,这是我的清单和构建文件以及我的布局文件。谢谢。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dev.cromer.jason.whatsappening" >

    <permission android:name="com.dev.cromer.jason.whatsappening.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.dev.cromer.jason.whatsappening.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:fullBackupContent="true"
        android:icon="@drawable/icon_logo"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".activities.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".activities.MapActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name=".activities.SetMarkerTitleActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name=".activities.SearchPlaceActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name=".activities.SetMarkerDescriptionActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name=".activities.MarkerDescriptionActivity"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>

这是我的构建:

apply plugin: 'com.android.application'

android 
    compileSdkVersion 23
    buildToolsVersion "22.0.1"

    defaultConfig 
        applicationId "com.dev.cromer.jason.whatsappening"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 12
        versionName "1.012"
    
    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    


dependencies 
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'com.google.android.gms:play-services:7.8.0'

和我的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:theme="@style/AppTheme">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_
        android:layout_
        android:id="@+id/map"
        tools:context="com.dev.cromer.jason.whatsappening.activities.MapActivity"
        android:name="com.google.android.gms.maps.SupportMapFragment">
    </fragment>


    <EditText
        android:id="@+id/searchBarEditText"
        android:layout_
        android:layout_
        android:background="@drawable/textview_border"
        android:alpha=".8"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:hint="@string/search_bar_hint"
        android:singleLine="true"
        android:textColor="#000000"
        android:padding="8dp" />


    <ImageView
        android:id="@+id/poweredBy"
        android:contentDescription="@string/powered_by_google_image"
        android:layout_
        android:layout_
        android:src="@drawable/powered_by_google_light"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

【问题讨论】:

试试***.com/a/19627394/5202007 要生成 SHA1 以获取 Google API 密钥,您必须使用签名的 apk 证书。 @Clairvoyant,我知道,我以前用我的其他应用程序做过几次。我正在使用签名的 apk 证书。我在 Google API 凭据部分使用我的签名证书中的 SHA1,以及与我的应用程序中的 SHA1 对应的 Google API 密钥。所以它应该工作,但它不是。它仅在我使用调试 SHA1 处于调试模式时才有效。 @Tauqir,我在我的 android 应用程序中使用它,为什么要使用浏览器密钥? @Jason,您会在下拉菜单中找到 Android Key 的选项。 【参考方案1】:

更新:

原来我的 API 密钥存储在项目调试目录下的资源 xml 文件中。 我需要将它放在我的项目或发布目录中,然后在我的清单文件中指定该字符串,而不是调试目录下的那个。这是我遇到的问题。感谢您抽出宝贵时间发表评论。

【讨论】:

以上是关于Google API 密钥不适用于 Android的主要内容,如果未能解决你的问题,请参考以下文章

新的 Google API 密钥“Google Maps API v3”不适用于 Google Places API?

Google api 密钥不适用于我的 ios 应用程序

Google Maps v3 API密钥不适用于本地测试

浏览器 API 密钥不适用于referer

如何获取 Android 内部应用程序共享密钥 SHA1 以启用 Google API?

Google 登录不适用于 Android 的发布版本