MapActivity:以编程方式设置APIKey

时间:2010-08-19 00:31:47

标签: android google-maps key api-key

我目前在我的应用程序中使用MapActivity。 我使用2个API密钥。一个用于调试,一个用于“生产”

我厌倦了在xml布局中更改这些值:

 <view class="com.google.android.maps.MapView" 
        android:id="@+id/myGmap" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="@string/api_key_prod" />

我厌倦了每次尝试更改apikey并且每次都通过调试替换prod。

是否可以在我的应用程序的onCreate()中更改此密钥。

想象一下,我有一个布尔首选项,如:isDebug。

我可以检查手机上的首选项,并在用户应用程序上默认禁用它。并做出类似的事情:

 if (isDebug)
     myMap.setApiKey(R.string.api_key_debug)
 else
     myMap.setApiKey(R.string.api_key_prod)

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:8)

您不能在布局中同时拥有窗口小部件并在Java中设置API密钥。

如果通过其构造函数动态创建MapView,则可以从Java代码中提供API密钥,但是您需要将其动态添加到布局中。

话虽这么说,我会通过你的构建过程处理这个问题(例如,基于调试/生产构建,将正确的XML文件复制到正确的目录中)。

答案 1 :(得分:5)

这适合我。

这里记录了MapView构造函数的这个变种: https://developers.google.com/maps/documentation/android/reference/com/google/android/maps/MapView

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    String mapApiKey = <your choice logic here>
    mMapView = new MapView(this, mapApiKey);
    setContentView(mMapView);

答案 2 :(得分:1)

您必须动态创建Google地图对象。您的布局将仅包含用于创建对象的父布局。

答案 3 :(得分:1)

您应该使用Product Flavors

例如:

android {
    ...


    defaultConfig {
        minSdkVersion 8
        versionCode 10
    }


    productFlavors {
        dev {
            resValue "string", "google_maps_api_key", "DEV_API_KEY"
         }

        prod {
            resValue "string", "google_maps_api_key", "PROD_API_KEY"
         }
    }
}