Android的GPS精确度甚至还没有接近内置的地图应用程序(Android GPS accurac

2019-09-24 04:13发布

我一直在尝试了Android SDK现在几个星期,试图实现从后台服务的准确位置。

尝试一些配置后,我现在有这样一个循环:

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(true);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
bestProvider = locationManager.getBestProvider(criteria, true);
lastKnownLocation = locationManager.getLastKnownLocation(bestProvider);

然后我检查lastKnownLocation飘飞的位置更新。 我知道你可以听进行更新,但目前我没有太在意,现在这种权利。 我所关心的是,(我认为)我所要求的手机使用GPS只要有可能 - 而不是确定位置的其他方法 - 一但它仍然会返回从一个好距离纬度/经度远,但是当我打开地图应用程序,它有我数米之内。

任何人都可以建议我要去哪里错了吗?

Answer 1:

设置标准刚刚确立其提供最好视他们使用,这样并没有真正对准确性或位置的有效性的发言权。 我刚才设置的供应商马上到GPS(全球定位系统如果可以!)。

此外,它似乎并不像你给它关于多久你想基于时间和距离更新之前等待的任何要求。 下面是我做的使用意图和广播接收器的一个例子。 它可以帮助你。

public void beginMonitoringLocation(int minDistance) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(MainActivity.LOCATION_UPDATE_ACTION);
            this.mContext.registerReceiver(this.locationReceiver, filter);

            LocationManager mLocationManager = (LocationManager) this.mContext.getSystemService(Context.LOCATION_SERVICE);
            mLocationManager.addGpsStatusListener(this);
            boolean enabled =  mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            if (!enabled) {
                Log.e("LocationManager", "GPS not enabled!!!!");
            } 

            LocationProvider provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER); // GET THE BEST PROVIDER FOR OUR LOCATION
            Log.d("LocationManager:","Location Provider:"+provider);
            if ( provider == null ) {
                Log.e( "LocationManager", "No location provider found!" );
                return;
            }

            final int locationUpdateRC=0;

            int flags = 0;

            Intent intent = new Intent(MainActivity.LOCATION_UPDATE_ACTION); 
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this.mContext, locationUpdateRC, intent, flags); 
            // PENDING INTENT TO BE FIRED WHEN THE LOCATIONMANAGER RECEIVES LOCATION UPDATE.
            // THIS PENDING INTENT IS CAUGHT BY OUR BROADCAST RECEIVER
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,minDistance,pendingIntent);
            this._monitoringLocation = true;
    }

然后在同一个班,我把我的broadcast receiver

public BroadcastReceiver locationReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Location location = (Location) intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
        if (location != null) {
            //Do something with it  
        }
        }
    };

我的意图过滤器的动作只是一个静态的参考我的活动而设定的常数。

public static final String LOCATION_UPDATE_ACTION = "com.corecoders.sqlmaptrack.LOCATION_UPDATE_RECEIVED";

这个工作在我的情况下,给我提供了准确的位置。 你可以,如果你想要什么,然后你就会发现你的每5秒的精度的定位坐标,如果你有4颗卫星以上的良好的固定的距离设置为0。

我希望这可以帮助你



Answer 2:

我用下面的代码,以获得准确的位置。 使用下面的代码,你可以处理启用/禁用编程的GPS。

private void enableGPSTracking() {

            new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    toggleGPS(true, getApplicationContext());

                    provider = LocationManager.GPS_PROVIDER;
                    Criteria locationCritera = new Criteria();
                    locationCritera.setAccuracy(Criteria.ACCURACY_FINE);
                    locationCritera.setAltitudeRequired(false);
                    locationCritera.setBearingRequired(false);
                    locationCritera.setCostAllowed(true);                   locationCritera.setPowerRequirement(Criteria.NO_REQUIREMENT);
                    provider = locationManager.getBestProvider(locationCritera,
                            true);

                    Intent intent = new Intent(
                            "com.example.gps.LOCATION_READY");
                    pendingIntent = PendingIntent.getBroadcast(
                            getApplicationContext(), 0, intent,
                            PendingIntent.FLAG_CANCEL_CURRENT);
                    // Register for broadcast intents
                    locationManager.requestLocationUpdates(provider, 0, 0,
                            pendingIntent);
                } catch (Exception e) {

                }

            }
        }.start();

    }

public static void toggleGPS(boolean flag, Context context) {

        try {
            Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
            intent.putExtra("enabled", flag);
            context.sendBroadcast(intent);
        } catch (Exception e) {

        }
    }

禁用GPS,即速false为ToggleGPS()方法的标志值。 希望这可以帮助你。



文章来源: Android GPS accuracy not even close to built in maps app