2010-08-09 181 views
4

我的應用程序使用大量的MapView屏幕,我試圖弄清楚如何在調試環境和生產之間管理API密鑰。顯然,沒有辦法在Eclipse中更改調試應用程序密鑰,所以我必須在該環境中使用調試映射API密鑰。相反,如果沒有生產應用程序密鑰,則無法導出包進行beta測試,因此我必須在每個視圖中更改地圖API密鑰才能創建工作包。管理Google Maps 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不能自己引用。任何其他想法?

謝謝

回答

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串把同一個名字......一個被稱爲調試,而不是其他。

+0

好一個關鍵,這不是太糟糕的方式來做到這一點。我想我會使用這種方法,直到Android/Google/Eclipse團隊提出更多自動化。 – user409849 2010-08-09 22:30:30

0

您可以在Prefs窗口 - > Android-> Build中設置自定義調試密鑰庫。

+0

以下是關於Android文檔的信息:「如有必要,您可以更改調試密鑰庫/密鑰的位置/名稱或提供要使用的自定義調試密鑰庫/密鑰。但是,任何自定義調試密鑰庫/密鑰必須使用(如上所述)(在Eclipse/ADT中,轉到Windows>首選項> Android>生成「 請注意,您可以使用自定義密鑰存儲,但您擁有自定義密鑰存儲使用相同的密碼作爲默認值,這不會真的有幫助 – user409849 2010-08-09 22:08:30

1

我認爲這是一個很好的做法!隨着Sephy的改正,它應該完美運作。最重要的是,如果你想在調試&發佈版本之間自動切換按鍵,你可以看看這篇文章,我剛剛寫道:http://blog.cuttleworks.com/2011/02/android-dev-prod-builds/。它幫助我在爲不同的環境構建時停止擔心配置。

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編輯器設置我的地圖視圖。

1

我正在使用maven-android-plugin,我正在使用一個鬼鬼祟祟的令牌替換機制來做到這一點。

我使用了「morseflash」樣品,並已將此添加到Maven的資源插件配置:

<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> 

這創建了一個名爲Maven的財產調試Maps鍵後,其值是釋放調試鍵。

不幸的是,Maven屬性不允許以數字開頭。我的調試密鑰和釋放密鑰都以08Wfj...開頭,所以我使用了分隔符>08*<,並確保在我的替換字符串中包含>08

8

我推薦一種更簡單的方法,它涉及利用不太可能的但更具體的資產文件夾來存放調試密鑰。要這樣設置,創建一個文件RES /價值/圖-apikey.xml具有以下內容:

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

然後每個開發人員在本地將增加從這一資源中獲得的文件/值-V1/maps- apikey.xml提供了其調試API密鑰。在運行時,Android系統將支持所有Android版本(因爲所有版本都至少在API級別1或更高版本上)更具體的版本res/values-v1/maps-apikey.xml。

像git和svn這樣的源代碼控制系統允許你添加一個「忽略」文件,它指示工具忽略這個res/values-v1/maps-apikey.xml文件,以便每個開發者不會意外地將它提交給庫。要做到這一點的git,只需添加一個文件res/.gitignore,其中只包含行值v1,然後提交此文件。

要發佈您的軟件,只需在導出發佈之前刪除res/values-v1/maps-apikey.xml文件即可。然後,生成的APK將引用res/values/maps-apikey.xml中的版本,這是您的正確生產密鑰。

+2

只想發表評論,' - '不是'res/values/maps-apikey.xml'中的有效資源名稱字符。Excelenet solution! – Prizoff 2012-08-16 21:22:45

+1

爲了完整性,在你的'AndroidManifext.xml'中引用它,你可以[this](https://gist.github.com/mgalgs/ea9f0a511c6a14e9fdbc)。 – mgalgs 2015-01-04 07:44:23

1

嘗試這樣:

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

String mapKey = BuildConfig.DEBUG ? debugMapKey : releaseMapKey; 

MapView mv = new MapView(this, mapKey);