如何通过GPS_PROVIDER获得更高的准确性

 谁的FrankyCH 发布于 2023-01-06 13:17

我的挑战任务是获得非常高的准确性.所以我使用的是GPS_PROVIDER.但我的代码准确性不正确.有一段时间它显示我离我当前位置10到50米.有一段时间它显示我离我当前位置5到15米的距离.我已经测试了两个设备,如XOLO和索尼.我已经完成了这些问题并且无法修复它.这是我的代码: -

@Override
protected void onResume() {
    super.onResume();

    if(mMap!= null)
        mMaprivate LatLng geo;
map.clear();

    locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);             
    mFragment = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.map);
    mMap = mFragment.getMap(); 
    }
   setListener();
 }

private void setListener() {    
    System.out.println("setListener()  locationListener = "+locationListener);
    if(locationListener != null){
        clearListener();
    }

    Toast toast = Toast.makeText(this, this.getResources().getString(R.string.maps_loading), Toast.LENGTH_LONG);
    toast.show();   
    private LatLng geo;

    locationListener = new CustomLocationListener();

    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    //criteria.setAccuracy(Criteria.ACCURACY_HIGH);
    criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
    String bestProvider = locationManager.getBestProvider(criteria, true); 
    Toast.makeText(this, "bestProvider= "+bestProvider, Toast.LENGTH_SHORT).show();
//  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
   locationManager.requestLocationUpdates(bestProvider, 0, 0, locationListener);

    handler=new Handler();
    timeoutTask = new TimeoutTask(locationListener);
    handler.postDelayed(timeoutTask, 50*1000);
}

private void clearListener(){
    if(locationListener != null){
        locationManager.removeUpdates(locationListener);
        locationListener = null;
    }
}

private void gotLocation(Location location){
    loc = location;
    System.out.println("getLocation = "+location.getLatitude());
 //   Toast.makeText(getBaseContext(), "new Lat = "+location.getLatitude(), Toast.LENGTH_LONG).show();
}

public class CustomLocationListener implements LocationListener {
    private boolean isCompleted = false;

    public CustomLocationListener() {}

    @Override
    public void onLocationChanged(Location location) {
        isCompleted=true;

        System.out.println("onLocationChanged 1");

          // Called when a new location is found by the GPS location provider.
          if(isBetterLocation(location, loc)){
            //  Toast.makeText(getBaseContext(), "yes", Toast.LENGTH_LONG).show();
              System.out.println("onLocationChanged 2");
              gotLocation(location);
          }
          System.out.println("onLocationChanged 3");
          clearListener();
          setUserPoint();
    }

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

    @Override
    public void onProviderEnabled(String provider) { }

    @Override
    public void onProviderDisabled(String provider) { }

    public boolean isCompleted() {
        return isCompleted;
    }private LatLng geo;

}   
private LatLng geo;

 public class TimeoutTask implements Runnable {

    private CustomLocationListener listener;

    public TimeoutTask(CustomLocationListener listener) {
        this.listener=listener;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        if (listener == null || listener.isCompleted()) {
            Log.e("provider", "completed");
       }
        else {
            Toast.makeText(ScorecardMapViewActivity.this, "We were unable to find your position, please try again", Toast.LENGTH_LONG).show();
            Log.e("provider", "timeout");
            clearListener();
            setUserPoint();
            if(goToScorecardStep3WithLocation) finish(); 
        }
    }
}



protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if (currentBestLocation == null) {
        // A new location is always better than no location
        return true;
    }

    // Check whether the new location fix is newer or older
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // If it's been more than two minutes since the current location, use the new location
    // because the user has likely moved
    if (isSignificantlyNewer) {
        return true;
    // If the new location is more than two minutes older, it must be worse
    } else if (isSignificantlyOlder) {
        return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
            currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) {
        return true;
    } else if (isNewer && !isLessAccurate) {
        return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
        return true;
    }
    return false;
}

private LatLng geo;

private void setUserPoint() {
    if(!goToScorecardStep3WithLocation) {
    if(loc != null) {

         if(handler != null) { System.out.println("removed timeout task from handler");
            handler.removeCallbacks(timeoutTask); }

        geo = HelperUtil.getLatLng(loc);
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(geo, 18));
        mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

        System.out.println("loc.getLatitude() = "+loc.getLatitude());
        System.out.println("loc.getLongitude() = "+loc.getLongitude());

        // your current position show.
         mMap.addMarker(new MarkerOptions().title("Player").position(geo)
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_point)));
}
}
}

请任何一位专家帮助我.你的帮助将非常有帮助.谢谢!

更新:-

我注意到我在同一个地方.有时我得到长小数点和有时小小数点.是否也会因小数点计算距离而产生任何影响?我在Yard计算距离.

当前位置= 纬度28.65361000000004长= 77.4122733333333

之前的当前位置点(这是相同的地方,但是纬度/长度不同)

Lat = 28.653685000000003 Long = 77.4123083333334

我有8码的距离.我认为一些问题可能是由于长或小的数字点.是否有办法让我们只获得长小数?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有