Android:自动选择调试/发布Maps v2 API密钥?

45
我正在我的项目中使用Google Maps v2 API。在Google Maps v2中,调试/发布API密钥是在AndroidManifest.xml中定义的。我看过这个链接,但在那个地图中,密钥是在xml布局文件中定义的,而不是在AndroidManifest.xml中。那么我能否在AndroidManifest.xml中为我的项目定义调试和发布密钥?
我希望在AndroidManifest.xml中实现以下内容:
如果是调试模式:
<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/debug_map_api_key"/>

如果是发布模式:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/release_map_api_key"/>

2
https://dev59.com/SGYr5IYBdhLWcg3wM3f6 - Divya Motiwala
我从这个链接中得到了灵感。谢谢。 - Kirit Vaghela
@KiritVaghela 嘿,Kirit,你好吗,我的朋友?还记得你在我开发Cheatbook时解决了我的ListView问题吗?但那些混蛋终止了我的开发者账户。 - JRE.exe
需要3次应用程序暂停才能终止您的帐户(无论是同时还是过一段时间),所以第一次违规是描述(这不是我的错),我写了适当的描述并留有空格,但它自己删除了所有空格并导致了暂停。第二个是知识产权(那是我的唯一过失,因为我从未听说过这样的事情)。第三个是我制作了一个聊天应用程序,由于用户的不当行为而被暂停(Google太愚蠢了)。我写信给他们3次,但他们从未回复。现在计划出售我的手机以获得IOS帐户和应用程序的费用。 - JRE.exe
他们提供的原因是多次违反了条款和条件。我的账户在今年三月份被终止,当时我每个月赚取6万印度卢比,而那只是刚开始。。 - JRE.exe
显示剩余2条评论
4个回答

69

使用 build.gradle

buildTypes {

    debug {
        buildConfigField("String", "map_api_key", "\"your debug map api key here\"")
    }
    release {
        buildConfigField("String", "map_api_key", "\"your release map api key here\"")
    }
}

我按照以下步骤解决了这个问题:

在Google开发者API控制台中:

  1. 点击创建新的Android密钥...
  2. 在cmd.exe/Terminal中输入:keytool -list -v -keystore mystore.keystore
  3. 输入密码:android
  4. 现在输入调试用的SHA1密钥;包名并按Enter键
  5. 输入发布用的SHA1密钥;包名
  6. 点击创建

现在将此API密钥用于您的项目中。

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/common_map_api_key"/>

2
我不知道你可以为同一个包添加多个SHA1密钥。效果非常好。 - shkschneider
第一个SHA1密钥使用debug.keystore,第二个SHA1密钥使用release.keystore。在我的情况下,它可以在调试apk和发布apk中工作。 - Kirit Vaghela
键的顺序并不重要。 - Lee Han Kyeol
1
@KiritVaghela 这里能否使用不同的包名?我想用单个Google项目绑定2个应用程序。这样是否可行? - Bipin Vayalu
在Android最新版本中实现的快速方法。https://dev59.com/BGQn5IYBdhLWcg3wCzik#39265698 - Zumry Mohamed

32

在最新的Android 5.0和Android 6.0、Android 9+(API 20、21、22、23、24、25、26、27、28、29)中使用build.gradle文件的最佳方法之一

你可以简单地使用它们,而不需要在gradle中创建产品风味。这是我们可以通过Gradle实现的另一个示例。你只需执行两个简单步骤即可实现。

  • 将自定义值添加到manifestplaceholders build.gradle文件中。

请参见下面的代码:

buildTypes {
    debug {
        manifestPlaceholders = [ mapApiKeyValue:"GHjaSyAjlyp3O831lgaonHMXsd-_DpQ3002x3S4"]
    }

    release {
        manifestPlaceholders = [ mapApiKeyValue:"AIzaSyAuMGDLr2HeuRed4JA0CrdYYdZRjeC3EA"]
    }
}
  • 请按照下面的方式编辑清单文件。

我的清单文件的一部分

  <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="${mapApiKeyValue}" />

此解决方案适用于最新的Android 5.0和Android 6.0(API 20、21、22、23)。


更新于2018年5月3日,适用于Xamarin表单和Xamarin本机应用程序

在Android项目中打开AssemblyInfo.cs并添加以下代码。

#if DEBUG
   [assembly: MetaData("com.google.android.maps.v2.API_KEY", Value = "DebugKey123123123")]
#else
   [assembly: MetaData("com.google.android.maps.v2.API_KEY", Value = "ReleaseKey123123123")]
#endif

要检查AndroidManifest文件,请转到obj / Debug / android文件夹并打开清单文件,然后检查元信息,

<meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="DebugKey123123123" />

2
谢谢。如果您想添加一些自定义键而不是使用Google API,这个答案真的很有用。 - Dmitry

16

对于需要维护不同密钥的组织,您可以将它们放置在Android Studio中的不同目录中。确保您使用的src子目录与flavor或buildType匹配。

来自使用Gradle构建项目

To build each version of your app, the build system combines source code and resources from:

src/main/ - the main source directory (common to all variants)
src/<buildType>/ - the build type source directory
src/<flavorName>/ - the flavor source directory

projectroot/yourapp/build.gradle中:
buildTypes {
    debug {
        runProguard false
        debuggable true

    }
    release {
        runProguard true
        debuggable false
        ...
    }

项目根目录/yourapp/src/main/AndroidManifest.xml中:
...
<application
    android:name=".MyApplication"
    android:theme="@style/Theme">
<!-- Don't put your key here -->
...

项目根目录/你的应用/src/debug/AndroidManifest.xml中,完全限定应用程序名称。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="com.hipmunk.android.HipmunkApplication">
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="yourdebugkey" />
    </application>
</manifest>

项目根目录/yourapp/src/release/AndroidManifest.xml中:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="com.hipmunk.android.HipmunkApplication">
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="release key" />
    </application>
</manifest>

8
由于您正在使用gradle,因此可以执行以下操作:
build.gradle
android {
  .. .. ...
    buildTypes {
       debug {
          resValue "string", "google_maps_api_key", "[YOUR DEV KEY]"
       }
       release {
           resValue "string", "google_maps_api_key", "[YOUR PROD KEY]"
       }
    }
  }

在你的AndroidManifest.xml文件中

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_api_key"/>

这样做可以让您只拥有一个AndroidManifest.xml文件,而您可以根据构建类型设置值。希望这能够帮助您。


应用程序将如何知道使用哪个密钥? - TheLearner
1
只需使用 getResources().getString(R.string.google_maps_api_key) 即可轻松实现,然后根据您的 Build Variant debug / _release_,Android Studio 将自动获取正确的 API 密钥。 - DanixDani
非常干净的解决方案,是我最喜欢的。 - 最白目

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接