MapActivity: set APIKey programmatically

10,798

Solution 1

This works for me.

This variant of MapView constructor is documented here: 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);

Solution 2

You cannot both have the widget in your layout and set the API key in Java.

If you dynamically create the MapView via its constructor, you can supply the API key that way from Java code, but then you will need to dynamically add it to your layout.

That being said, I'd deal with the problem via your build process (e.g., based on debug/production build, copy the right XML file into the right directory).

Solution 3

You should use Product Flavors.

For example:

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

Solution 4

You have to create google maps object dynamically. Your layout will contaion only parent layout for creating object.

Share:
10,798
Waza_Be
Author by

Waza_Be

android dev

Updated on June 06, 2022

Comments

  • Waza_Be
    Waza_Be almost 2 years

    I currently use a MapActivity in my application. I use it with 2 API Keys. One for debugging, and one for "production"

    I am fed up with changing these values in the xml layout:

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

    I am fed up trying to change the apikey each time and replace prod by debug each time.

    Is that possible to change this key within the onCreate() of my application.

    Imagine that I have a boolean preference that look like: isDebug.

    I may check thi preference on my phone and disable it by default on user application. and make something like:

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

    Thank a lot for any help.

  • Akshay Bhat 'AB'
    Akshay Bhat 'AB' almost 6 years
    @CommonsWare Any suggestion on how we can change api key if we have dynamic flavour change within the app?
  • CommonsWare
    CommonsWare almost 6 years
    @AkshayBhat'AB': I do not know what a "dynamic flavour change" is. Also, please note that this question and its answers are from 2010, which is a very long time ago, and they refer to an older generation of the Maps SDK (Maps V1, compared to the current Maps V2).
  • Akshay Bhat 'AB'
    Akshay Bhat 'AB' almost 6 years
    @CommonsWare "dynamic flavour" in the sense we have multiple base urls and multiple analytics tracking ids as well as multiple maps api keys. In the app we have a screen which allows to change the "flavour". I was able to change url and tracking ids on the fly except maps api key. So just wanted to know if we can reinitialize maps with different api keys dynamically in the app.
  • CommonsWare
    CommonsWare almost 6 years
    @AkshayBhat'AB': No. The Maps V2 API key is for the app, based on its applicationId and signing key. Neither of those values will be changing when the user, in the app, changes the flavour.
  • gianlucaparadise
    gianlucaparadise almost 5 years
    Apparently this has been deprecated.