Android 我想用谷歌融合定位api获得准确的位置?

Android 我想用谷歌融合定位api获得准确的位置?,android,google-maps,fusedlocationproviderapi,android-fusedlocation,Android,Google Maps,Fusedlocationproviderapi,Android Fusedlocation,我使用的是融合定位Api,我得到的定位精度约为10米。有时它能提供4到8米的精度。我想更准确地使用这个融合定位Api或任何其他方式。是否有任何方法可以获得精度低于4米的位置 我用这种方法得到了位置 public class GetCurrentLocation implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { private static

我使用的是融合定位Api,我得到的定位精度约为10米。有时它能提供4到8米的精度。我想更准确地使用这个融合定位Api或任何其他方式。是否有任何方法可以获得精度低于4米的位置

我用这种方法得到了位置

    public class GetCurrentLocation implements
            ConnectionCallbacks, OnConnectionFailedListener, LocationListener {

        private static final String TAG = "location-updates-sample";
        public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 0;
        public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
                UPDATE_INTERVAL_IN_MILLISECONDS / 2;
        private final String REQUESTING_LOCATION_UPDATES_KEY = "requesting-location-updates-key";
        private final String LOCATION_KEY = "location-key";
        private final String LAST_UPDATED_TIME_STRING_KEY = "last-updated-time-string-key";
        private GoogleApiClient mGoogleApiClient;
        private LocationRequest mLocationRequest;

        private Context mContext;
        private getLocation mGetCurrentLocation;

        public GetCurrentLocation(Context context) {
            mContext = context;

            buildGoogleApiClient();
        }

        private synchronized void buildGoogleApiClient() {
            Log.i(TAG, "Building GoogleApiClient");
            mGoogleApiClient = new GoogleApiClient.Builder(mContext)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
            createLocationRequest();
        }

        public interface getLocation{
            public void onLocationChanged(Location location);
        }

        public void startGettingLocation(getLocation location) {
            mGetCurrentLocation = location;
            connect();
        }

        public void stopGettingLocation() {
            stopLocationUpdates();
            disconnect();
        }

        private void createLocationRequest() {
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
            mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        }

        private void startLocationUpdates() {
            if (mGoogleApiClient.isConnected()) {
                LocationServices.FusedLocationApi.requestLocationUpdates(
                        mGoogleApiClient, mLocationRequest, this);
            }
        }
    private void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    }



    private void connect() {
        mGoogleApiClient.connect();
    }

    private void disconnect() {
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.i(TAG, "Connected to GoogleApiClient");
        startLocationUpdates();

    }

    @Override
    public void onLocationChanged(Location location) {
        mGetCurrentLocation.onLocationChanged(location);
    }

    @Override
    public void onConnectionSuspended(int cause) {
        Log.i(TAG, "Connection suspended");
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
    }
}
我在我的活动代码中使用这个类

private GetCurrentLocation mListen;
mListen = new GetCurrentLocation(this);
            mListen.startGettingLocation(new GetCurrentLocation.getLocation() {
                @Override
                public void onLocationChanged(Location location) {
                   // Here is my working with location object
                }

            });
如何优化此代码以获得准确的位置。
谢谢。

定位精度取决于GPS/网络提供商,您只能等待并从他们那里获取位置

您可以再次确定精度

@Override
public void onLocationChanged(Location location) {
   int suitableMeter = 20; // adjust your need
   if (location.hasAccuracy()  && location.getAccuracy() <= suitableMeter) {
        // This is your most accurate location.
   }

}
@覆盖
已更改位置上的公共无效(位置){
int suitableMeter=20;//调整您的需要

2020年最佳官方解决方案中的if(location.hasAccurance()&&location.getAccurance()

Google API客户端/FusedLocationApi已被弃用,位置管理器根本没有用处。 所以Google更喜欢使用Google Play services位置API的融合位置提供商 “FusedLocationProviderClient”用于获取位置及其更好的方式,以节省电池电量并提高准确性

以下是kotlin中的示例代码,用于获取最后一个已知位置/一次性位置(相当于当前位置)


如果您的应用程序可以连续跟踪位置,则您必须接收位置更新

检查kotlin中的样本

// declare a global variable FusedLocationProviderClient
        private lateinit var fusedLocationClient: FusedLocationProviderClient
    
    // in onCreate() initialize FusedLocationProviderClient
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
    

      // globally declare LocationRequest
        private lateinit var locationRequest: LocationRequest
    
        // globally declare LocationCallback    
        private lateinit var locationCallback: LocationCallback
    
    
        /**
         * call this method in onCreate
         * onLocationResult call when location is changed 
         */
        private fun getLocationUpdates()
        {
    
                fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
                locationRequest = LocationRequest()
                locationRequest.interval = 50000
                locationRequest.fastestInterval = 50000
                locationRequest.smallestDisplacement = 170f // 170 m = 0.1 mile
                locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY //set according to your app function
                locationCallback = object : LocationCallback() {
                    override fun onLocationResult(locationResult: LocationResult?) {
                        locationResult ?: return
    
                        if (locationResult.locations.isNotEmpty()) {
                            // latest location is on 0th index
                            val location =
                                LatLng(locationResult.locations[0].latitude, locationResult.locations[0].longitude)
                            // use your location object
                            // get latitude , longitude and other info from this
                        }
    
    
                    }
                }
        }
    
        //start location updates
        private fun startLocationUpdates() {
            fusedLocationClient.requestLocationUpdates(
                locationRequest,
                locationCallback,
                null /* Looper */
            )
        }
    
        // stop location updates
        private fun stopLocationUpdates() {
            fusedLocationClient.removeLocationUpdates(locationCallback)
        }
    
        // stop receiving location update when activity not visible/foreground
        override fun onPause() {
            super.onPause()
            stopLocationUpdates()
        }
    
        // start receiving location update when activity  visible/foreground
        override fun onResume() {
            super.onResume()
            startLocationUpdates()
        }
确保您关心位置的Mainfaist权限和运行时权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
更多详情请参考这些官方文件


我认为这段代码非常完美。我不认为它可以更优化。如果location.hasAccurance()为false,location.getAccurance()将始终返回0.0。在评估位置的准确性之前,必须检查hasAccurance()。请参阅
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
implementation 'com.google.android.gms:play-services-location:17.0.0'