LocationManager 说我在南极洲

LocationManager says I'm in Anttarctica

显然我不是。这是我用来获取位置的内容。

SingleShotLocationProvider.requestSingleUpdate(getContext(),
                            new SingleShotLocationProvider.LocationCallback() {
                                @Override
                                public void onNewLocationAvailable(SingleShotLocationProvider.GPSCoordinates location) {
                                    //use location.longitude and location.latitude
                                }
                            });

这是我在上面使用的class:

public class SingleShotLocationProvider {

public interface LocationCallback {
    void onNewLocationAvailable(GPSCoordinates location);
}

public static void requestSingleUpdate(final Context context, final LocationCallback callback) {
    final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    //If network is available
    if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        try {
            locationManager.requestSingleUpdate(criteria, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude()));
                }
                @Override public void onStatusChanged(String provider, int status, Bundle extras) {}
                @Override public void onProviderEnabled(String provider) {}
                @Override public void onProviderDisabled(String provider) {}
            }, null);
        }
        catch (SecurityException e){
            Log.e("Location", "security exception");
        }
    }
    //If GPS is enabled
    else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        try {
            locationManager.requestSingleUpdate(criteria, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude()));
                }
                @Override public void onStatusChanged(String provider, int status, Bundle extras) {}
                @Override public void onProviderEnabled(String provider) {}
                @Override public void onProviderDisabled(String provider) {}
            }, null);
        }
        catch (SecurityException e){
            Log.e("Location", "security exception");
        }
    }
    else{
        Toast.makeText(context, "No network or GPS available. Try again later.", Toast.LENGTH_LONG).show();
    }
}


// consider returning Location instead of this dummy wrapper class
public static class GPSCoordinates {
    public float longitude = -1;
    public float latitude = -1;

    public GPSCoordinates(float lon, float lat) {
        longitude = lon;
        latitude = lat;
    }

    public GPSCoordinates(double lon, double lat) {
        longitude = (float) lon;
        latitude = (float) lat;
    }
}
}

有人知道这里发生了什么吗?此外,出于某种原因,我只能在启用 GPS 时获取位置,而不是通过我的 network/wifi。如果我尝试禁用 GPS,即使我有良好的网络连接,if 和 elif 条件也会失败。想法?

您传递的参数顺序不正确。在 GPSCoordinates 的构造函数中,您期望经度和纬度按此顺序。当您创建 GPSCoordinates 时,您会以相反的顺序传递纬度和经度。

将您的 GPSCoordinates 更改为:

public static class GPSCoordinates {
    public float longitude = -1;
    public float latitude = -1;

    public GPSCoordinates(float lat, float lon) {
        latitude = lat;
        longitude = lon;
    }

    public GPSCoordinates(double lat, double lon) {
        latitude = (float) lat;
        longitude = (float) lon;
    }
}