管理Google Maps API密钥

时间:2010-08-09 17:29:24

标签: android google-maps api-key

我的应用程序使用了大量的MapView屏幕,我试图弄清楚如何在调试环境和生产之间管理API密钥。显然,没有办法在Eclipse中更改调试应用程序密钥,因此我必须在该环境中使用调试映射API密钥。相反,如果没有生产应用程序密钥,就无法导出用于beta测试的软件包,因此我必须在每个视图中更改map API密钥以创建工作软件包。

我的第一个想法是这样做:

所有MapView.xml文件都有:

android:apiKey="@string/googleMapsAPIKey"

然后在strings.xml中我把它放在:

<string name="googleMapsPIKey">@string/debugGoogleMapsAPIKey</string>
<string name="debugGoogleMapsAPIKey">TheMagicKeyString</string>

如果这样做,它将允许我在strings.xml中更改一行,并且所有MapView都将在重建中更新。但它没有用。我猜strings.xml不能自己引用。还有其他想法吗?

由于

8 个答案:

答案 0 :(得分:8)

我建议采用一种更简单的方法,即利用一个不太可能但更具体的资产文件夹来存放调试密钥。要进行此设置,请使用以下内容创建文件res / values / maps-apikey.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="maps_apikey">[productionApiKey]</string>
</resources>

然后,每个开发人员在本地将在res / values-v1 / maps-apikey.xml中添加从此文件派生的文件,其中提供了调试API密钥。在运行时,Android系统将支持所有Android版本的更具体的版本res / values-v1 / maps-apikey.xml(因为所有版本至少都在API级别1或更高级别)。

像git和svn这样的源控制系统允许您添加“忽略”文件,该文件指示工具忽略此res / values-v1 / maps-apikey.xml文件,以便每个开发人员不会意外地将其提交到存储库。要为git执行此操作,只需添加一个文件res / .gitignore,其中只包含行值-v1,然后提交此文件。

要发布您的软件,只需在导出版本之前删除res / values-v1 / maps-apikey.xml文件。然后,生成的APK将引用res / values / maps-apikey.xml中的版本,这是您正确的生产密钥。

答案 1 :(得分:3)

你做的是正确的事,但不是我认为正确的方式。在strings.xml中声明你的字符串,如下所示:

<string name="googleMapsAPIKey">TheMagicKeyString</string>
<!-- You can add this at the end as comment to keep a copy of another key for instance, to exchange it between debug and production-->

请注意,您没有在2个字符串中使用相同的名称...一个名为debug而不是另一个。

答案 2 :(得分:2)

我正在使用maven和maven-android-plugin,以及仅在发布配置中使用的res-overlay目录。

因此,我有一个包含调试密钥的res/values/google_api_key.xml文件和一个包含生产密钥的res-overlay-production/values/google_api_key.xml文件,后者在生产版本中覆盖了前者。

我也在使用Eclipse ADT,但是这不知道发布配置,所以很高兴看到调试密钥,我可以使用Android XML编辑器来设置我的地图视图。

答案 3 :(得分:1)

我认为这是一个很好的方法!随着Sephy的修正,它应该可以完美地运作。

最重要的是,如果你想在调试和放大之间自动切换键。发布版本,你可以看看我刚写的这篇文章:http://blog.cuttleworks.com/2011/02/android-dev-prod-builds/。在为不同的环境构建时,它帮助我不再担心配置。

答案 4 :(得分:1)

我正在使用maven-android-plugin而我正在使用偷偷摸摸的令牌替换机制来执行此操作。

我正在使用“morseflash”示例,并将其添加到maven-resources插件配置中:

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>resources</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
      <delimiters>
        <delimiter>${*}</delimiter>
        <delimiter>&gt;08*&lt;</delimiter>
      </delimiters>
    </configuration>
</plugin>

资源插件允许您为搜索/替换定义奇怪的分隔符。默认分隔符为${*},但我添加了>*<,因此它将匹配XML元素内容。 (实际上我使用>08*<;我稍后会解释原因。)

然后,在我的strings.xml中,我写了这个:

<string name="googleMapsAPIKey">08DEBUGKEYABCDEFBLAHBLAHBLAH</string>

并在发布配置文件中定义了Maven属性,如下所示:

<profile>
    <id>release</id>
    <!-- via this activation the profile is automatically used when the release is done with the maven release
    plugin -->
    <activation>
        <property>
            <name>performRelease</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <DEBUGKEYABCDEFBLAHBLAHBLAH>&gt;08RELEASEKEYABCDEFBLAHBLAHBLAH&lt;</DEBUGKEYABCDEFBLAHBLAHBLAH>
    </properties>
    <-- ... -->
</profile>

这将创建一个以调试Maps键命名的Maven属性,其值为release调试密钥。

不幸的是,Maven属性不允许以数字开头。我的调试密钥和我的发布密钥都以08Wfj...开头。所以我使用了分隔符>08*<并确保在我的替换字符串中包含>08

答案 5 :(得分:1)

尝试这样的事情:

String debugMapKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String releaseMapKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

String mapKey = BuildConfig.DEBUG ? debugMapKey : releaseMapKey;

MapView mv = new MapView(this, mapKey);

答案 6 :(得分:0)

您可以在Prefs窗口中设置自定义调试密钥库 - &gt; Android-&GT;构建

答案 7 :(得分:0)

在google开发者控制台中,您可以为多个sha1代码创建一个键 https://stackoverflow.com/a/13881624/1433372