Android GPS最初工作但后来返回空值

时间:2016-10-26 14:40:58

标签: java android sqlite gps

这是一款简单的GPS记录仪。纬度和经度值每10秒登录一次SQLite数据库。

这在第一次运行我的应用程序时有效,但是当应用程序再次运行时,位置值为空,我的表永远不会更新值。

public class GPSService extends Service {

    public static final String TAG = GPSService.class.getSimpleName();
    private static final int ONGOING_NOTIFICATION_ID = 1000;
    public static final String GPS_WAKE_LOCK = "GPSWakeLock";
    public static final int GPS_TIME_THRESHOLD = 10000; // 10 sec
    public static final int GPS_DISTANCE_THRESHOLD = 10; // 10 meters
    public static EventBus bus = EventBus.getDefault();
    private LocationManager lm;
    private LocationManager locationManager2;
    private LocationListener locationListener;
    private Location location = null;
    private Timer timer;
    private DumpTask dumpTask = null;
    private DatabaseHelper myDb = null;
    private static boolean active = false;
    private PowerManager.WakeLock wakeLock = null;
    public static Double Latitude;
    public static Double Longitude;
    public static int TotalNoOfStations;
    public float[] result = new float[2];
    public int k;
    public static Boolean SwitchOffAlarmService=false;
    @Override
    public void onCreate() {
        super.onCreate();
        bus.register(this);
        timer = new Timer();
        myDb = DatabaseHelper.getInstance(this);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager2 = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationListener = new MyLocationListener();
        Log.d(TAG, "onCreate ");
        k=0;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "destroyed");
        bus.unregister(this);
        timer.cancel();
        stopService(new Intent(this,GPSService.class));
        super.onDestroy();
    }

    @SuppressWarnings("unused")
    public void onEvent(GPSLoggerCommand e) {
        if (e.command == GPSLoggerCommand.START && !active) {
            Log.d(TAG, "start gps logger");
            getRouteDetails();
            MainActivity.LocationServiceStarted=true;
            getLatLonFromDB();

            try {
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIME_THRESHOLD, GPS_DISTANCE_THRESHOLD, locationListener);
            }catch (SecurityException ex){
                Log.e(TAG, "onEvent " + ex.toString());
            }

            dumpTask = new DumpTask();
            timer.schedule(dumpTask, GPS_TIME_THRESHOLD, GPS_TIME_THRESHOLD);
            active = true;
        } else if (e.command == GPSLoggerCommand.STOP && active) {
            Log.d(TAG, "stop gps logger");
            dumpTask.cancel();
            try {
                lm.removeUpdates(locationListener);
            }catch(SecurityException ex){
                Log.e(TAG, "onEvent " + ex);
            }
            bus.post(new StatusReply("total rows " + myDb.getRowsCount()));
            stopForeground(true);
            active = false;
            locationManager2.sendExtraCommand(LocationManager.GPS_PROVIDER,"delete_aiding_data",null);
            Bundle bundle = new Bundle();
            locationManager2.sendExtraCommand("gps","force_xtra_injection",bundle);
            locationManager2.sendExtraCommand("gps","fource_time_injection",bundle);
            stopService(new Intent(this,GPSService.class));
        } else if (e.command == GPSLoggerCommand.STATUS) {
            Log.d(TAG, "onEvent send message " + active);
            bus.post(new GPSLoggerStatus(active));
        }
    }

    public class MyLocationListener implements LocationListener {

        public void onLocationChanged(Location loc) {
            if (loc != null) {
                Log.d(TAG, "onLocationChanged " + loc.getLatitude() + ":" + loc.getLongitude());
                location = loc;
            }
        }

        public void onProviderDisabled(String provider) {
            Log.d(TAG, "onProviderDisabled");
            Toast.makeText(GPSService.this, "Service Canceled due to GPS being Disabled!!", Toast.LENGTH_SHORT).show();
            GPSLoggerCommand c;
            c = new GPSLoggerCommand(GPSLoggerCommand.STOP);
            bus.post(c);
            MainActivity.GPServiceStarted=false;
            MainActivity.LocationServiceStarted=false;
        }

        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled");
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            String showStatus = null;
            if (status == LocationProvider.AVAILABLE)
                showStatus = "Available";
            if (status == LocationProvider.TEMPORARILY_UNAVAILABLE)
                showStatus = "Temporarily Unavailable";
            if (status == LocationProvider.OUT_OF_SERVICE)
                showStatus = "Out of Service";
            Log.d(TAG, "onStatusChanged " + showStatus);
        }

    }

    public class DumpTask extends TimerTask {

        @Override
        public void run() {
            Log.d(TAG, "dump to base");
            if (location != null) {
                // write to database
            }
        }
    }


    public static void StopServiceFunction()
    {
        GPSLoggerCommand c;
        c = new GPSLoggerCommand(GPSLoggerCommand.STOP);
        bus.post(c);
        MainActivity.GPServiceStarted=false;
        MainActivity.LocationServiceStarted=false;
        active = false;
    }



}

1 个答案:

答案 0 :(得分:0)

implement GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener

在您的活动中,并在覆盖方法中使用以下代码

 @Override
public void onConnected(@Nullable Bundle bundle) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

    if (location == null) {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);

    } else {

        mCurrentLatitude = location.getLatitude();
        mCurrentLongitude = location.getLongitude();
        Toast.makeText(this,  mCurrentLongitude + " * ********"+mCurrentLatitude, Toast.LENGTH_LONG).show();
    }
}