开发者

stop gps on exiting app

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 implemen开发者_JAVA技巧ts 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> 


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);
}


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 .

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜