简体   繁体   English

Android GPS追踪器每次返回0表示经度和纬度

[英]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 ! 我正在尝试使用在mainActivity中调用的服务来获取用户位置。我相信我已经完成了所有必要的工作,但是每次经度0和纬度0时,我都会得到问题! 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: 这就是我在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 ! 因此,感谢Dainel,我发现了它的工作原理! 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 对于与我有同样问题的人,只需使用此链接中的此代码即可使用Google Play服务ACCESS_COARSE_LOCATION权限可在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 好吧,说实话,我对GPSTracker不太熟悉,但我至少建议您进行更改

 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. 根据我的收集,“ arg0”是更新的位置,并且从未在该方法中使用。 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? 可能我建议您尝试重组代码的GPS部分吗? There is a new Location API that is much easier to use than LocationManager and is not fraught with so many implementation concerns. 有一个新的Location API,它比LocationManager更加易于使用,并且没有太多实现问题。

Fused Location Provider API manages concerns like Power Management for issues surrounding battery. 融合位置提供程序API可解决诸如电源管理之类的有关电池问题的问题。 A good example is located on Github GitHub上有一个很好的例子

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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