Android 我想用谷歌融合定位api获得准确的位置?
我使用的是融合定位Api,我得到的定位精度约为10米。有时它能提供4到8米的精度。我想更准确地使用这个融合定位Api或任何其他方式。是否有任何方法可以获得精度低于4米的位置 我用这种方法得到了位置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
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'