【问题标题】:Current location, Latitude and Longitude当前位置、纬度和经度
【发布时间】:2013-02-11 12:33:43
【问题描述】:

我的问题是获取纬度和经度。

在模拟器中我使用:Lat - 54.035795,Long - 21.760029。但是当我打电话给 getLatitude()getLongitude() 时,我得到 54.0 和 21.0。
所以我无法获得两点之间的准确距离。 有什么问题?

请帮帮我。

public final class LocationGpsListener implements LocationListener 
{

        private final Context mContext;
        public 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 LocationGpsListener(Context context) {
            this.mContext = context;
            getLocation();
        }

        public Location getLocation() {
            try {
                locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
                isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                Log.v("isGPSEnabled", "=" + isGPSEnabled);

                isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                Log.v("isNetworkEnabled", "=" + isNetworkEnabled);

                if (isGPSEnabled == false && isNetworkEnabled == false) {

                } 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);
                            Log.d("GPS Enabled", "GPS Enabled");
                            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(LocationGpsListener.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(mContext);

            alertDialog.setTitle("GPS");
            alertDialog.setMessage("GPS is ENABLED:");

            alertDialog.setPositiveButton("Settings",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent(
                                    Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            mContext.startActivity(intent);
                        }
                    });

            alertDialog.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
            alertDialog.show();
        }

        @Override
        public void onLocationChanged(Location location) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

}

我使用:

mGPS = new LocationGpsListener(this);

if(mGPS.canGetLocation ){

    longitude = mGPS.getLatitude();
    latitude = mGPS.getLongitude();         
}else{
     longitude = 21.230000;
     latitude = 53.230000;
}

Location l1 = new Location("lok a");
l1.setLatitude(latitude);
l1.setLongitude(longitude);

Location l2 = new Location("lok b");
l2.setLatitude(54.035679);
l2.setLongitude(21.784879);                             

【问题讨论】:

    标签: android location latitude-longitude


    【解决方案1】:

    我无法重现您的问题,但我可以为您提供代码的改进版本:

    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    
    public final class LocationGpsListener implements LocationListener {
    
        public boolean isGPSEnabled = false;
    
        private Location location;
    
        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 LocationGpsListener(Context context) {
            locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            // TODO check is network/gps is enabled and display the system settings
            // see
            // https://github.com/unchiujar/Umbra/blob/master/src/main/java/org/unchiujar/umbra/activities/FogOfExplore.java#L599
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,
                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
    
            location = new Location("fake");
            location.setLatitude(0);
            location.setLongitude(0);
        }
    
        public void stopLocationUpdates() {
            if (locationManager != null) {
                locationManager.removeUpdates(LocationGpsListener.this);
            }
        }
    
        public double getLatitude() {
            return location.getLatitude();
        }
    
        public double getLongitude() {
            return location.getLongitude();
        }
    
        @Override
        public void onLocationChanged(Location location) {
            this.location = location;
        }
    
        @Override
        public void onProviderDisabled(String provider) {
            // NO-OP
        }
    
        @Override
        public void onProviderEnabled(String provider) {
            // NO-OP
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // NO-OP
        }
    
    }
    

    您发布的代码没有正确使用侦听器模式(我的也没有,但这是一种改进)。位置逻辑应该在onLocationChanged 方法中,而不是在其他地方的随机方法中。在

    我推荐你阅读:http://www.vogella.com/articles/AndroidLocationAPI/article.html

    另外,永远不要使用catch(Exception e),它会导致各种非常难以追踪的错误。 Why is the Catch(Exception) almost always a bad Idea? http://today.java.net/article/2006/04/04/exception-handling-antipatterns#catchingException

    【讨论】:

    • tnx,但我有更大的问题:(
    • 我没有提到它,但我发布的代码应该可以解决您的问题 :)
    • 你在哪里设置位置?
    • 我得到 54.0,没有 54.035795 :(
    • 根据'requestLocationUpdates'中传递的选项在'onLocationChanged'中设置位置(在这种情况下每10米或60秒)
    【解决方案2】:

    我认为问题在于您对所使用的位置提供程序不够具体,并且您正在恢复课程准确性。

    使用Criteria 获取最佳位置提供程序以设置所需的精度:

    locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_HIGH);  
    locationManager.getBestProvider(criteria, true);
    

    或者也可以使用以 Criteria 作为参数的 requestLocationUpdates 的覆盖。

    检查上述内容,并在您的清单中添加"android.permission.ACCESS_FINE_LOCATION"

    【讨论】:

      【解决方案3】:

      我的问题是在我的 GPS 设置好的价值之前获取位置

      我遇到了一个有趣的问题(当应用程序崩溃时): “记住,检查设备是否有 GPS” :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 2011-08-31
        • 2013-07-06
        • 2013-01-11
        相关资源
        最近更新 更多