【问题标题】:Location Manager smallest displacement with high accuracy android位置管理器最小位移与高精度android
【发布时间】:2014-12-10 11:16:00
【问题描述】:

我正在尝试实现一个使用用户当前位置的应用程序。由于我需要 PRIORITY_HIGH_ACCURACY,我想在用户不移动时停止这些 gps 更新。目前我的代码如下所示。

mLocationClient = new LocationClient(this, this, this);
mLocationClient.connect();

并在连接后执行以下操作。

Location location = mLocationClient.getLastLocation();
locationrequest = LocationRequest.create(); 
locationrequest.setSmallestDisplacement(10f);
locationrequest.setInterval(10*1000);
locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationClient.requestLocationUpdates(locationrequest, this);

问题是 minimumDisplacement 根本不起作用。我试图删除:

locationrequest.setInterval(10*1000);

但在我删除它后,我没有收到任何其他位置更新。谁能告诉我我做错了什么?

【问题讨论】:

    标签: android gps location locationmanager android-location


    【解决方案1】:

    只有使用 GPS 才能实现高精度。您需要从 gps 获取位置更新,而不是从 newtwork 提供商处获取。

    即使您从 GPS 获取值,也请确保您是在建筑物外测试应用程序。如果您在建筑物内,有时您不会收到位置更改更新。

    我知道这听起来可能很傻,但我遇到了这个问题,如果我在开放式顶部测试我的代码,它对我有用。

    我不确定这是否有效,但如果你有同样的感觉,值得一试。

    供您参考,我正在使用以下类来获取位置更新。

    public class GPSTracker extends Service implements LocationListener {
    
        private final Context mContext;
    
        // flag for GPS status
        boolean isGPSEnabled = false;
    
        // flag for network status
        boolean isNetworkEnabled = false;
    
        // flag for GPS status
        boolean canGetLocation = false;
    
        Location location; // location
        double latitude; // latitude
        double longitude; // longitude
    
        // The minimum distance to change Updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    
        // The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
    
        // Declaring a Location Manager
        protected LocationManager locationManager;
    
        public GPSTracker(Context context) {
            this.mContext = context;
            getLocation();
        }
    
        public Location getLocation() {
            try {
                locationManager = (LocationManager) mContext
                        .getSystemService(LOCATION_SERVICE);
    
                // getting GPS status
                isGPSEnabled = locationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
    
                // getting network status
                isNetworkEnabled = locationManager
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
                if (!isGPSEnabled && !isNetworkEnabled) {
                    // no network provider is enabled
                } else {
                    this.canGetLocation = true;
                    if (isNetworkEnabled) {
                        locationManager.requestLocationUpdates(
                                LocationManager.NETWORK_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("Network", "Network");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                    // if GPS Enabled get lat/long using GPS Services
                    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;
        }
    
        /**
         * Stop using GPS listener
         * Calling this function will stop using GPS in your app
         * */
        public void stopUsingGPS(){
            if(locationManager != null){
                Log.i("GPSTracker:", "Removing Loc Updates");
                locationManager.removeUpdates(GPSTracker.this);
            }
            //StopService
            Log.i("GPSTracker:", "Stopping GPS Service");
            stopSelf();
        }
    
        /**
         * Function to get latitude
         * */
        public double getLatitude(){
            if(location != null){
                latitude = location.getLatitude();
            }
    
            // return latitude
            return latitude;
        }
    
        /**
         * Function to get longitude
         * */
        public double getLongitude(){
            if(location != null){
                longitude = location.getLongitude();
            }
    
            // return longitude
            return longitude;
        }
    
        /**
         * Function to check GPS/wifi enabled
         * @return boolean
         * */
        public boolean canGetLocation() {
            return this.canGetLocation;
        }
    
        /**
         * Function to show settings alert dialog
         * On pressing Settings button will lauch Settings Options
         * */
        public void showSettingsAlert(){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    
            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");
    
            // Setting Dialog Message
            alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
    
            // On pressing Settings button
            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);
                }
            });
    
            // on pressing cancel button
            alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    //Stop Service
                    stopSelf();
                    dialog.cancel();
                }
            });
    
            // Showing Alert Message
            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) {
        }
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
    }
    

    谢谢。

    【讨论】:

    • 我试过你的示例代码。它正在工作。但问题是在固定位置获取位置更新并绘制路线。你能告诉如何在固定位置停止位置更新吗?
    猜你喜欢
    • 2014-04-17
    • 2015-11-17
    • 2015-05-30
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2016-11-18
    相关资源
    最近更新 更多