生成 Google 地图发布密钥

Posted

技术标签:

【中文标题】生成 Google 地图发布密钥【英文标题】:Generating a Google Maps Release Key 【发布时间】:2016-01-08 10:24:16 【问题描述】:

所以我在我的应用程序中使用了 google maps api。我添加了活动并将 api 密钥放入 google_maps_api.xml(debug) 中,然后创建了一个不同的 api 密钥并将其放入 /release 下的 google_maps_api.xml 中,我必须去文件资源管理器才能找到它。如果我通过 android studio 中的绿色播放按钮启动应用程序,则地图加载得很好。但是当我在构建下生成 apk 时,地图不会加载。我相信这是由于 api 不起作用。我担心的一个问题是编辑 google_maps_api(release) 的唯一方法是在资源管理器中找到它。非常感谢所有帮助!

这是清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nick.mowen.receiptmanager" >

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:allowBackup="true"
        android:fullBackupContent="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <service android:name=".GeofenceTransitionsIntentService" />

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

            <meta-data
                android:name="android.app.default_searchable"
                android:value=".SearchableActivity" />
        </activity>
        <activity
            android:name=".SettingsActivity"
            android:label="@string/Settings"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
        <activity
            android:name=".ViewCodeActivity"
            android:label="Receipt Code"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
        <activity
            android:name=".GetHelp"
            android:label="@string/get_help_title"
            android:parentActivityName=".SettingsActivity" >
            <meta-data
                android:name="android.support.PARENT.ACTIVITY"
                android:value=".SettingsActivity" />
        </activity>
        <activity
            android:name=".CodeAdder"
            android:label="@string/title_activity_code_adder"
            android:parentActivityName=".MainActivity"
            android:theme="@style/AppTheme.NoActionBar" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.nick.mowen.receiptmanager.MainActivity" />
        </activity>
        <activity android:name=".SearchActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".LocationPicker"
            android:label="@string/title_activity_location_picker" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.nick.mowen.receiptmanager.CodeAdder" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

这里是 build.gradle:

apply plugin: 'com.android.application'

android 
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig 
        applicationId "com.nick.mowen.receiptmanager"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    
    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
    compile 'com.android.support:recyclerview-v7:23.0.1'
    compile 'com.google.android.gms:play-services-maps:8.1.0'
    compile 'com.google.android.gms:play-services:8.1.0'

【问题讨论】:

您必须更改活动的构建变体才能查看特定于发布的资源。一般在左下角 你能发布你的应用程序的 build.gradle 文件吗? 好的,刚刚添加了build.gradle。 您在构建 APK 时使用什么密钥库?您是否使用相同的密钥库来生成第二个 Maps API 密钥? 我通过点击开发者控制台的链接添加了 api 密钥,并输入了 SHA-1 指纹和包名称。 【参考方案1】:

您可以使用相同的 Android API 密钥进行调试和发布。

软件包名称可以相同,但由于您无法使用调试密钥库对您的发行版进行签名,因此证书指纹应该不同

使用 keytool 命令检查发布指纹是否正确:

keytool -list -v -keystore my_release_store.keystore

【讨论】:

【参考方案2】:

如果您使用的是 android studio,请转到“项目”视图。您会在 app >> src >> release >> res >> values

下找到 google_maps_api(release)

您需要将 signingConfigs 添加到您的 build.gradle (Module:app) 文件中。

这是我的文件包含的 -

android 
compileSdkVersion 21
buildToolsVersion '21.0.1'

defaultConfig 
    applicationId "com.example"
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"

buildTypes 
    release 
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    

signingConfigs 
    release 
        storeFile file('Path\\YourReleaseKey.jks')
        storePassword 'password'
        keyAlias 'YourAlias'
        keyPassword 'password'
    

buildTypes 
    release 
        signingConfig signingConfigs.release
    

另外,请在多个设备上尝试。由于设备上的某些应用程序设置,我曾经遇到过问题。在我重置所有应用程序设置后它起作用了。

【讨论】:

以上是关于生成 Google 地图发布密钥的主要内容,如果未能解决你的问题,请参考以下文章

Android:Google Map v2 未显示发布 apk 的地图

适用于所有开发人员的一个 Google 地图密钥?

即使在 Flutter 中使用正确的 SHA1 密钥,Google 地图也无法在发布版本中工作

Google静态地图api与密钥和无密钥之间的区别?

升级到 SupportMapFragment 后,您需要新的 google api 地图密钥吗?

将 Google 地图添加到 Flutter 时找不到 API 密钥