Google Maps Android API v2 application crashes
I’m using Eclipse helios and Android 4.1.2
I followed the documentation below https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw And complete the coding exactly as described in the tutorial. When I run my app on the emulator, it says “This app won’t run unless you update Google Play Services” but on a real device, i.e. Sony xperia, it has Google Play Services update version and it crashes “The app has stopped working. Thanks for any help.
Here is my list
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.emeterfinalapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_CORSE_LOCATION" />
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<permission
android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="com.google.android.maps"/>
<activity
android:name="com.example.emeterfinalapp.EmeterMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/FullscreenTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.emeterfinalapp.EnterLocationActivity"
android:label="@string/title_activity_enter_location"
android:parentActivityName="com.example.emeterfinalapp.EmeterMainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.emeterfinalapp.EmeterMainActivity" />
</activity>
<activity
android:name="com.example.emeterfinalapp.SelectLocation"
android:label="@string/title_activity_select_location"
android:parentActivityName="com.example.emeterfinalapp.EnterMainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.emeterfinalapp.EnterMainActivity" />
</activity>
</application>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="my api key"/>
</manifest>
This is my main .xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SelectLocation" >
<Button
android:id="@+id/satellite_button"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/mapview_button"
android:text="@string/satellitebuttontext" />
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_below="@+id/satellite_button"/>
<LinearLayout android:id="@+id/zoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/mapview_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/mapbuttontext" />
</RelativeLayout>
This is my Activity
package com.example.emeterfinalapp;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
public class SelectLocation extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_location);
// Show the Up button in the action bar.
getActionBar().setDisplayHomeAsUpEnabled(true);
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
}
}
I referenced the google_play_services library in my project, added the google_play_service and android.support.v4 jar files in my library…. If I’m still missing anything, please guide ….
I have api key, I’ve added it to maifest, see edit above…
AMD This is the bug trace in my phone log
I/ActivityManager( 282): Displayed com.example.emeterfinalapp/.EmeterMainActivity: +206ms
I/ActivityManager( 282): Displayed com.example.emeterfinalapp/.EnterLocationActivity: +224ms
W/InputDispatcher( 282): channel '2c3dbfd0 com.example.emeterfinalapp/com.example.emeterfinalapp.EmeterMainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8
E/InputDispatcher( 282): channel '2c3dbfd0 com.example.emeterfinalapp/com.example.emeterfinalapp.EmeterMainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
W/InputDispatcher( 282): Attempted to unregister already unregistered input channel '2c3dbfd0 com.example.emeterfinalapp/com.example.emeterfinalapp.EmeterMainActivity (server)'
W/InputDispatcher( 282): channel '2c504fb8 com.example.emeterfinalapp/com.example.emeterfinalapp.EnterLocationActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8
E/InputDispatcher( 282): channel '2c504fb8 com.example.emeterfinalapp/com.example.emeterfinalapp.EnterLocationActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
W/InputDispatcher( 282): Attempted to unregister already unregistered input channel '2c504fb8 com.example.emeterfinalapp/com.example.emeterfinalapp.EnterLocationActivity (server)'
Solution
Wow… After scratching my head for a long time, I finally found a solution
First I followed its documentation to debug a real device using DDMS, which was great, and then I found the following error
12-12 15:08:29.458: E/AndroidRuntime(26382): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.emeterfinalapp/com.example.emeterfinalapp.SelectLocation}: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
Then another eye-catching error came after a few lines of code
12-12 15:08:29.458: E/AndroidRuntime(26382): Caused by: java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
Then I realized that my api key code was the list that the error pointed out above and not a child of the application, and then I corrected my list to the following
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.emeterfinalapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_CORSE_LOCATION" />
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<permission
android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="com.google.android.maps"/>
<activity
android:name="com.example.emeterfinalapp.EmeterMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/FullscreenTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.emeterfinalapp.EnterLocationActivity"
android:label="@string/title_activity_enter_location"
android:parentActivityName="com.example.emeterfinalapp.EmeterMainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.emeterfinalapp.EmeterMainActivity" />
</activity>
<activity
android:name="com.example.emeterfinalapp.SelectLocation"
android:label="@string/title_activity_select_location"
android:parentActivityName="com.example.emeterfinalapp.EnterMainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.emeterfinalapp.EnterMainActivity" />
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="my api key"/>
</application>
Then it goes like a zoom and everything is perfect… Debugging with real equipment helps a lot…