Java – Google Maps Android API v2 application crashes

Google Maps Android API v2 application crashes… here is a solution to the problem.

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…

Related Problems and Solutions