简体   繁体   中英

Android GPS tracker return everytime 0 for the longitude and latitude

I m trying to get the user location using the service that i call in my mainActivity.I believe i made already all the work needed but the problem i get back everytime 0 for the longitude and 0 for latitude ! I added user permission too but its not working ! This is the service class:

public class GPSTracker extends Service implements LocationListener{

private final Context context;

boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;

Location location;

double latitude;
double longitude;

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;

protected LocationManager locationManager;

public GPSTracker(Context context) {
    this.context = context;
    getLocation();
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);

        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if(!isGPSEnabled && !isNetworkEnabled) {

        } else {
            this.canGetLocation = true;

            if (isNetworkEnabled) {

                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                    if (location != null) {

                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }

            }

            if(isGPSEnabled) {
                if(location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    if(locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                        if(location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}


public void stopUsingGPS() {
    if(locationManager != null) {
        locationManager.removeUpdates(GPSTracker.this);
    }
}

public double getLatitude() {
    if(location != null) {
        latitude = location.getLatitude();
    }
    return latitude;
}

public double getLongitude() {
    if(location != null) {
        longitude = location.getLongitude();
    }

    return longitude;
}

public boolean canGetLocation() {
    return this.canGetLocation;
}

public void showSettingsAlert() {
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);

    alertDialog.setTitle("GPS is settings");

    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            context.startActivity(intent);
        }
    });

    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    alertDialog.show();
}

@Override
public void onLocationChanged(Location arg0) {
    // TODO Auto-generated method stub
    this.location = location;
    getLatitude();
    getLongitude();
}

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

}

@Override
public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub

}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

}

and this is how i call it in the mainActivity:

public class MainActivity extends Activity {

GPSTracker gps;



@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    gps = new GPSTracker(MainActivity.this);

    if (gps.canGetLocation()) {
        double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();
        Log.v("Your LOCATION is -" + "Lat:", latitude + "Long: " + longitude  );
        Toast.makeText(
                getApplicationContext(),
                "Your LOCATION is -\nLat: " + latitude + "\nLong: "
                        + longitude, Toast.LENGTH_LONG).show();
    } else {
        gps.showSettingsAlert();
    }





}
}

All suggestions are welcome

So thanks to Dainel i found out how it works ! For the people having the same problem as me just use google play services using this code from this link ACCESS_COARSE_LOCATION permission gives a cell tower precision on Android

and to make it as a service just use the intent on the main this way :

Intent GPSt = new Intent(this, yourClassName.class);
        startService(GPSt);

Well, to be honest, I'm not too familiar with the GPSTracker, but I would at least recommend changing

 public void onLocationChanged(Location arg0) { // TODO Auto-generated method stub this.location = location; getLatitude(); getLongitude(); } 

From what I gather, the "arg0" is the updated location and never used in the method. I would recommend changing it to.

 public void onLocationChanged(Location currentLocation) {
     this.location = currentLocation;
     getLatitude();
     getLongitude();
 }

Might I suggest you try restructuring the GPS portion of your code? There is a new Location API that is much easier to use than LocationManager and is not fraught with so many implementation concerns.

Fused Location Provider API manages concerns like Power Management for issues surrounding battery. A good example is located on Github

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM