java - 如何在android中获取准确的当前位置?

标签 java android gps latitude-longitude

我尝试过getLastKnownLocation(),但我发现它有时无法提供准确的位置,并且它获取了错误的位置,否则它很好。

有人可以帮助我吗? 我是 android studio 的初学者

下面是我的 GPS 跟踪器代码...

if (isGPSEnabled)
{
    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);
        updateGPSCoordinates();
    }
}
} else 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);
    updateGPSCoordinates();
}
}

// ...

@Override
public void onLocationChanged(Location location) 
{ 
this.location = location;
updateGPSCoordinates();
}

最佳答案

Android 开发者上有一个非常有用的页面 documentation , 我希望这能帮到您。出于我的目的,我必须对其进行一些调整,但主要思想保持不变:

You might expect that the most recent location fix is the most accurate. However, because the accuracy of a location fix varies, the most recent fix is not always the best. You should include logic for choosing location fixes based on several criteria. The criteria also varies depending on the use-cases of the application and field testing.

private static final long TWO_MINUTES = TimeUnit.MINUTES.toNanos(2);

/** Determines whether one Location reading is better than the current Location fix
  * @param location  The new Location that you want to evaluate
  * @param currentBestLocation  The current Location fix, to which you want to compare the new one
  */
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.getElapsedRealtimeNanos() - currentBestLocation.getElapsedRealtimeNanos();
    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;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
    if (provider1 == null) {
      return provider2 == null;
    }
    return provider1.equals(provider2);
}

关于java - 如何在android中获取准确的当前位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37485887/

相关文章:

android - 当我靠近存储的位置时收到通知

java io ioexception 无法解析来自服务器地理编码器的响应

android - 从Android项目构建jar文件时,任务 ':app:kaptGenerateStubsDebugKotlin'的执行失败

fragment 中的 Android Google Maps V2

java - Hibernate:如何从查询结果中获取属性?

java - 如何从 JFrame 中的网络摄像头捕获照片?

Android 查看后退堆栈而不弹出

java - 如何从连接到 Android 设备的串行 GPS 获取数据?

java - WebDriver 发现元素不包含属性

java - Hibernate:我不想删除 child