2016-05-27 17 views
1

私はgetLastKnownLocation()を試しましたが、時には正確な場所を提供できず、間違った場所を取得していることが判明しました。アンドロイドで正確な現在地を取得するには?

誰でも手伝ってもらえますか? 私はAndroidの開発者に対しdocumentationに本当に便利なページがあります

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(); 
} 
+0

「間違った場所」とはどういう意味ですか? GPSは100%正確ではなく、何らかのエラーがあります。また、GPSが屋内または屋外の場合は重要です。 – TDG

+0

私はこれらの週に多くのテストを行ってきましたが、その正確さは電話のブランドに大きく依存しています。 GPSチップを他のものよりも優れているものもあります...また、ここに記載されているLollipop OSにはいくつか問題があります:https://code.google.com/p/android/issues/detail?id=81140 – Jaythaking

+0

場所が間違っています時には、以前に取得された場所が更新された場所ではないことを示します。更新された場所(LastKnownLocationではなく)を取得することをお勧めします。 –

答えて

2

....これは、以下の私のGPSトラッカーコードである

アンドロイドスタジオに初心者です、私はこれはあなたを助けることを願っています。私の目的のために、私はそれを少し微調整しなければならなかったが、主な考え方は同じまま:

あなたは、最新の位置の修正が正確で最も であることを期待するかもしれません。ただし、ロケーションフィックスの精度が異なるため、最新のフィックスである が必ずしも最良ではありません。 のロジックには、いくつかの基準に基づいてロケーション修正を選択する必要があります。また、 という基準も、アプリケーションのユースケースとフィールド のテストによって異なります。

private static final int TWO_MINUTES = 1000 * 60 * 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.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; 
} 

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