0

上のユーザーの場所を更新することはできません。アンドロイドは - 私は、ユーザーの場所を更新しようとしてこだわっている活動の打ち上げ

私のアプリでは、地図のユーザーの現在地を表示しますが、locationManager.getLastKnownLocation()はキャッシュの場所を使用しているため別の場所 を返しています。私は、コールバックOnMapReadyにマップ上の正しい位置にマークを付けることができるように

は、どのように私は、現在の場所で最後の既知の位置を比較することができますか?私はStackOverflowので見つかった

すべての例では、LocationListener.onLocationChanged()メソッドを使用しているが、私は(必要な場合)の活動の立ち上げに場所を更新する必要があります。

コード:

private static final String TAG_MAP_LOAD_FAILED = "FAIL LOADING MAP STYLE"; 
private static final String TAG_MAP_PARSING_FAILED = "FAIL PARSING MAP STYLE"; 

private GoogleMap mMap; 
private LatLng mMyCoordinates; 
private LocationManager mLocationManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mLocationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); 
    getMapAsync(this); 
} 



@Override 
public void onMapReady(GoogleMap googleMap) { 

    mMap = googleMap; 

    try{ 
     boolean success = googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.style_mapjson)); 

     if(!success){ 
      Log.e(TAG_MAP_PARSING_FAILED, "Failed parsing JSON Style"); 
     } 

    }catch (Resources.NotFoundException ex){ 
     Log.e(TAG_MAP_LOAD_FAILED, "Can't find style. Error:", ex); 
    } 


    mMap.setIndoorEnabled(false); 

    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(mMyCoordinates); 
    markerOptions.title("Marker in my location"); 
    mMap.addMarker(markerOptions); 

    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMyCoordinates, 15); 
    mMap.moveCamera(cameraUpdate); 
    mMap.getUiSettings().setRotateGesturesEnabled(false); 

} 

@Override 
public void onLocationChanged(Location location) { 

} 

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

} 

@Override 
public void onProviderEnabled(String provider) { 

} 

@Override 
public void onProviderDisabled(String provider) { 

} 

OBS:それは失敗した試行のいっぱいになったので、私はコードをクリーンアップ。それがどのように構造化されているかを示します。

は、私が代わりにFusedLocationを使用する必要がありますか?

+0

はい。 'LocationManager'は別の実装を使用していますし、' GoogleMap'を使って接続コールバックを取得することはできません。あなたはそのアイディアをどこから得ましたか?それにはAPIクライアントが必要です。 [公式ドキュメント](https://developers.google.com/maps/documentation/android-api/start)ではなく、SOで最初に回答を探すのは、別のフォーラムの問題です。最後まで読んでみると、これを解決することができます。そして、拒否コードを使用しない限り、 'FusedLocation'を使用してください。 – Chisko

答えて

1

最後の既知の場所にはタイムスタンプが関連付けられていますが、これは過去にかなり時間がかかる可能性があります。最後に知られている場所のタイムスタンプと年齢の比較を行い、必要なときに更新を要求してください。あなたが場所を要求されないようにする

private static long MAX_TIME = 60 * 60 * 1000; //Update if location is older than one hour 

@Override 
public void onResume() { 
    super.onResume(); 
    Location location = mLocationManager.getLastKnownLocation(YOUR_PROVIDER_HERE); //GPS or Network 

    boolean shouldUpdateLocation = false; 
    if (location != null) { 
     long elapsedTime = System.currentTimeMillis() - location.getTime(); 
     if (elapsedTime >= MAX_TIME) { 
      shouldUpdateLocation = true; 
     } 
    } 
    else { 
     shouldUpdateLocation = true; 
    } 

    if (shouldUpdateLocation) { 
     //TODO: Request location update here. 
    } 
} 

活動が育っされるたびに更新するので、このための合理的なMAX_TIMEを設定します。ここでは、迅速かつ汚い例です。

+0

ありがとう、パブロ。もう1つ質問:私は 'requestSingleUpdate()'を使ってリフレッシュされた場所を取得する必要がありますか? –

+0

することができます、私はまともな精度で位置を得れば、私は 'requestLocationUpdatesを()'を使用して、それを止めるでしょうが。 –

+0

これが解決策であるかどうかテストし、質問を更新します!ありがとう! –

関連する問題