我的应用程序使用了大量的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不能自己引用。还有其他想法吗?
由于
答案 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>>08*<</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>>08RELEASEKEYABCDEFBLAHBLAHBLAH<</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