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>
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.
<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.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With