Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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>

like image 758
user2486322 Avatar asked Nov 12 '15 05:11

user2486322


People also ask

Can I use the same API key for multiple apps?

Note: You can set only one type of client restrictions per API key. For example, if you have both Android apps and iOS apps using your API, you must create separate API keys with the restrictions for each type of client app.

What is meta data in Android manifest?

<meta-data>A name-value pair for an item of additional, arbitrary data that can be supplied to the parent component. A component element can contain any number of <meta-data> subelements. The values from all of them are collected in a single Bundle object and made available to the component as the PackageItemInfo.


1 Answers

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
like image 94
MechEthan Avatar answered Sep 18 '22 04:09

MechEthan