2

Ok i have tried Nicholas's solution but still getting force close if i press the back button as the app searches for gps fix.so i m uploading all the codes and files(except icon.png and pen.png in drawables) for the project...so that it's possible just to copy paste the code from here to see whats going on. my main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/icon"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button android:text="Start" 
android:id="@+id/Button01" 
android:layout_width="120px" 
android:layout_height="70px"
android:layout_gravity = "center_horizontal"
android:textSize="20px"
android:layout_marginTop="150px"
android:clickable="true"
></Button>

</LinearLayout>

next my main activity(GpsLocEx.java)

package com.example.gpslocex;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class GpsLocEx extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button start = (Button) findViewById(R.id.Button01);
        start.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
             Intent map = new Intent(view.getContext(), com.example.gpslocex.ShowMap.class);
             startActivityForResult(map, 0);

            }

        });


 }
    }

next my gps.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:apiKey="06ZLf-HkdkRMb513KS2ZRljmMQL0bntlyMJ-rOQ"
    />

</RelativeLayout>

next ShowMap.java

package com.example.gpslocex;

import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class ShowMap extends MapActivity {

    private MapController mapController;
    private MapView mapView;
    private LocationManager locationManager;
    private GeoUpdateHandler geoUpdateHandler;

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.gps);
            mapView = (MapView) findViewById(R.id.mapview);
            mapView.setBuiltInZoomControls(true);
            mapView.setSatellite(true);
            mapController = mapView.getController();
            mapController.setZoom(14); // Zoom 1 is world view
            geoUpdateHandler = new GeoUpdateHandler();

            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                createGpsDisabledAlert();
            } else {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                        0,geoUpdateHandler);

            }

       }
     private void createGpsDisabledAlert() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder
                    .setMessage(
                            "Your GPS is disabled! Would you like to enable it?")
                    .setCancelable(false).setPositiveButton("Enable GPS",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    showGpsOptions();
                                }
                            });
            builder.setNegativeButton("Do nothing",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = builder.create();
            alert.show();
        }

     private void showGpsOptions() {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        } 


     @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }


    public class GeoUpdateHandler implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            int lat = (int) (location.getLatitude() * 1E6);
            int lng = (int) (location.getLongitude() * 1E6);
            GeoPoint point = new GeoPoint(lat, lng);
            mapController.animateTo(point); //  mapController.setCenter(point);
             MapOverlay mapOverlay = new MapOverlay();
              mapOverlay.setPointToDraw(point);
              List<Overlay> listOfOverlays = mapView.getOverlays();
              listOfOverlays.clear();
              listOfOverlays.add(mapOverlay);

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }


    class MapOverlay extends Overlay
    {
      private GeoPoint pointToDraw;

      public void setPointToDraw(GeoPoint point) {
        pointToDraw = point;
      }

      public GeoPoint getPointToDraw() {
        return pointToDraw;
      }

      @Override
      public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
        super.draw(canvas, mapView, shadow);           

        // convert point to pixels
        Point screenPts = new Point();
        mapView.getProjection().toPixels(pointToDraw, screenPts);

        // add marker
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pen);
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 128, null);    
        return true;
      }




    }
    @Override
    public void onPause() {
        locationManager.removeUpdates(geoUpdateHandler);
    }


}

next strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Version-1.0</string>
    <string name="app_name">GpsLocEx</string>

</resources>

Finally AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.gpslocex"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <uses-library android:name="com.google.android.maps" />
        <activity android:name=".GpsLocEx"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
<activity android:name=".ShowMap"></activity>

</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="ACCESS_COARSE_LOCATION" />

</manifest> 
kzs
  • 1,111
  • 5
  • 20
  • 35

2 Answers2

15

You can use the Android lifecycle methods to turn off the GPS when the Activity is no longer on top.

Use onPause(), onStop(), or onDestroy() to remove updates from your locationManager. Something like this:

@Override
public void onPause() {
    locationManager.removeUpdates(myLocationListener);
}

EDIT:

You have a ClassCastException in your onPause() method. You cannot cast this (your Activity) to a LocationListener (at least not without making your Activity implement LocationListener).

In your code, you create a new GeoUpdateHandler(). First, you should create an instanceVariable that is your GeoUpdateHandler. Underneath your instance variable for LocationManager, create one like this:

private GeoUpdateHandler geoUpdateHandler;

You should keep a handle to this in the onCreate() method:

@Override
public void onCreate(Bundle savedInstanceState) {
    //...some code here...
    geoUpdateHandler = new GeoUpdateHandler();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                        0,geoUpdateHandler);
    //...maybe some more code here...
}

And then in the onPause, pass the geoUpdateHandler to the removeUpdates function:

@Override
public void onPause() {
    locationManager.removeUpdates(geoUpdateHandler);
}

EDIT 2:

The stacktrace says it all:

android.app.SuperNotCalledException: Activity {com.example.gpslocnav6ex/com.example.gpslocnav6ex.ShowMap} did not call through to super.onPause()

Call through to super.onPause() in your onPause()

@Override
public void onPause() {
    super.onPause();
    locationManager.removeUpdates(geoUpdateHandler);
}
nicholas.hauschild
  • 42,483
  • 9
  • 127
  • 120
  • Perhaps you could amend your question with the stacktrace from the force close. – nicholas.hauschild May 26 '11 at 12:41
  • nichlos thank you so much..but the problem remains...for your convenience i have uploaded all the project files except pen.png and icon.png in drawables folder...kindly take a look above.. – kzs May 27 '11 at 11:08
  • Are you getting a new stacktrace from the force close? Can you post that? – nicholas.hauschild May 27 '11 at 12:21
  • @nicholas wow!..thats it!!...searched for so long about this problem...thank u very much Nicholas for the solution... – kzs Jun 01 '11 at 02:12
  • This solution doesn't make sense to me. Activity lifecycles don't tell you anything about whether your application has been backgrounded. onPause only tells you that the current Activity has been paused, possibly to bring another Activity on the Task stack to the front within your application. See: http://stackoverflow.com/questions/3314838/android-how-to-detect-if-current-stack-of-activities-task-moves-to-background – Dave Sims Mar 22 '12 at 20:46
  • @DaveSims what you are saying is correct, Activity lifecycles do not tell you whether or not the application has been backgrounded. But that is not the question here. You will have to look at the history of the question to see what was originally asked, but the user simply wanted to stop the GPS when their `MapActivity` was no longer the current `Activity`. That said, I have changed the wording in my original answer to reflect the word 'Activity' rather than 'Application'. – nicholas.hauschild Mar 22 '12 at 21:08
  • Thanks nicholas -- yeah the wording of both the question title "stop gps on exiting app" and your answer indicated the desire to stop GPS when the app "exited" i.e., was backgrounded. Appreciate the clarification. – Dave Sims Mar 23 '12 at 01:18
2

Try this locationManager.removeUpdates(myLocationListener);

Your should write it in onPause()

@Override
    protected void onPause()
    {
        // TODO Auto-generated method stub
        super.onPause();
                locationManager.removeUpdates(myLocationListener);
    }

This will turn off GPS when your exit from your application .

Sujit
  • 10,512
  • 9
  • 40
  • 45