Android - The API key can only be specified once <meta-data> duplicates

15,382

Delete your "com.google.android.maps.v2.API_KEY" meta-data entry.

The "com.google.android.geo.API_KEY" entry is sufficient for both the Maps and Places services.

Source: https://code.google.com/p/gmaps-api-issues/issues/detail?id=7824


EDIT - Google updated their documents to explicitly call this out now:

  1. https://developers.google.com/places/android-api/start#api-key
  2. https://developers.google.com/maps/documentation/android-sdk/signup#use-key
Share:
15,382

Related videos on Youtube

user2486322
Author by

user2486322

Updated on July 18, 2022

Comments

  • user2486322
    user2486322 almost 2 years

    I’m trying to add Google map in to may app, so I have taken the API key. Unfortunately when I inserted the API key in manifest.xml through a meta-data tag, it automatically inserted another meta-data tag at compile time as shown below. Now it generates below mentioned error. The worst case is, even I delete each of them or both, it automatically generates both tags at compile time again and throws the error.

    Any help?

    Error

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.exampl.t_collect/com.exampl.t_collect.activity.MapActivity}: android.view.InflateException: Binary XML file line #6: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2389)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2441)
            at android.app.ActivityThread.access$900(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
    .........
    Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    ..........
    Caused by: java.lang.RuntimeException: The API key can only be specified once. It is recommended that you use the meta-data tag with the name: com.google.android.geo.API_KEY in the <application> element of AndroidManifest.xml
            at com.google.maps.api.android.lib6.c.ad.a(Unknown Source)
            at com.google.maps.api.android.lib6.a.e.a(Unknown Source)
            at com.google.android.gms.maps.internal.CreatorImpl.b(Unknown Source)
    

    Manifast.xml meta tags

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exampl.t_collect"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />
    
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
    
    <!--
     To retrieve OAuth 2.0 tokens or invalidate tokens to disconnect a user. This disconnect
     option is required to comply with the Google+ Sign-In developer policies
    -->
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    

    <android:uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />
    <android:uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <android:uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />
    <android:uses-permission android:name="android.permission.READ_CALL_LOG" />
    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <!--
     The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
             Google Maps Android API v2, but are recommended.
        -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />
    
    <application
        android:allowBackup="true"
        android:debuggable="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.exampl.t_collect.activity.Login"
            android:label="@string/app_name"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Dash"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Collection"
            android:label="@string/title_activity_collection" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Collection1"
            android:label="@string/title_activity_collection" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Collection2"
            android:label="@string/title_activity_collection" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Advance"
            android:label="@string/title_activity_advance" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Customer"
            android:label="@string/title_activity_customer" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Data_store"
            android:label="@string/title_activity_data_store" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.DataRqeuset"
            android:label="@string/title_activity_data_rqeuset" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.Settings"
            android:label="@string/title_activity_settings" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.PastData_activity"
            android:label="@string/title_activity_past_data" >
        </activity>
    
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    
        <receiver android:name="com.exampl.t_collect.util.UploadGPS" />
    
        <activity
            android:name="com.exampl.t_collect.activity.findTrucks"
            android:label="@string/title_activity_find_trucks" >
        </activity>
    
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIzaSy*********************************" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_key" />
    
        <activity
            android:name="com.exampl.t_collect.activity.MapsActivity"
            android:label="@string/title_activity_maps" >
        </activity>
        <activity
            android:name="com.exampl.t_collect.activity.MapActivity"
            android:label="@string/title_activity_map" >
        </activity>
        <!-- Include the AdActivity and InAppPurchaseActivity configChanges and themes. -->
        <activity
            android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:theme="@android:style/Theme.Translucent" />
        <activity
            android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity"
            android:theme="@style/Theme.IAPTheme" />
    
        <meta-data
            android:name="com.google.android.gms.wallet.api.enabled"
            android:value="true" />
    
        <receiver
            android:name="com.google.android.gms.wallet.EnableWalletOptimizationReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.gms.wallet.ENABLE_WALLET_OPTIMIZATION" />
            </intent-filter>
        </receiver>
    </application>
    

    • Emil
      Emil over 8 years
      Can you show us the entire manifest file?
    • Emil
      Emil over 8 years
      Try and remove com.google.android.geo.API_KEY this meta data tag from your manifest. I don't know why its getting regenerated. Are you editing the correct manifest file? (app/src/main/AndroidManifest.xml)
    • user2486322
      user2486322 over 8 years
      yes. OMG just now i noticed. in the manifast there is an activity tag for com.exampl.t_collect.activity.MapsActivity which is also auto generating.
    • user2486322
      user2486322 over 8 years
      Actually i added a google map activity to my project previously and removed. i think this tag should relevant to that activity.
    • Vinay
      Vinay about 8 years
      Have you got the solution ?
  • Ramesh sambu
    Ramesh sambu over 7 years
    this is perfect solution