2016-05-05 8 views
-2

私はあなたの現在の位置を初期化して地図を表示する必要があるアプリケーションを構築しています。 LocationManager.requestLocationUpdates(...)で位置情報の更新をリクエストしていますが、場所が変更されたときにデータが表示されるだけです(たとえば10フィート移動するなど)。私もgetLastKnownLocationを使用しようとしていますが、(GPSをオンにしたり、アプリケーションを開かずに)GPSを回すような珍しいケースでは、これは私が使用しているすべてのプロバイダでnullを返します。現在の場所を更新中ではなく

getLastKnownLocationがnullを返すたびに、私のアプリは10フィート移動して位置更新を受け取るまで初期化できません。今のところ私は自分の現在地を調べる方法を見つけていないし、requestLocationUpdates(...)私が購読している瞬間に私の最初のデータを得ることができ、指定された期間を待つか、指定された距離。

1つのアプローチは非常に小さい時間間隔または0時間間隔で私に現在の位置を送信し、LocationListenerを削除して、もう一度requestLocationUpdates(...)を削除しますが、これはバッテリーを避けるために使用するはるかに大きな値です。

私はこれを解決するためのよりよい方法を探しています。おそらくgetCurrentLocation()のようなものですが、実際には動作するものです。

+2

正確な読み込みを得るには、いずれかのソリューションが場所を待つ必要があります。 GPSプロバイダが位置を取得できない場合は、nullが返されます。 FusedLocation APIには必要な更新の数を設定できるので、必要なものがあれば入手できるだけですが、まだhttps://developers.google.com/android/reference/com/google/を待つ必要がありますandroid/gms/location/LocationRequest.html#public-methods – tyczj

+1

"おそらくgetCurrentLocation()"のようなものですが、これは存在しません。場所を取得することが保証されていないからです。ユーザーがプロバイダを無効にする、またはAndroid 6.0以降でアクセス許可をブロックするという標準的な問題を超えて、デバイスは環境的要因のために場所を取得できない可能性があります。装置は、例えば、地下駐車場にあってもよい。何らかの種類のタイムアウト値を持つ 'getCurrentLocation()'がありますか?はい、それはあなた自身を実装するのは特に難しいことではありません。 – CommonsWare

答えて

1

私は LocationManager.requestLocationUpdates(...)で位置情報の更新を要求していますが、これは唯一の場所の変更が(例えば私は10フィートを移動する)とき 私にデータを提供するように見えます。

あなたが移動しているかどうかにかかわらず、場所が決定されるとすぐに最初の位置の更新が表示されます。そして最初のものがそれほど正確でない場合があるので、しばらくの間、更なる更新を聞いておくことは悪い考えではありません。

私はこれを解決するためのより良い方法を探しています。おそらく のgetCurrentLocation()のようなものでしょうが、実際には動作するものです。

継続的な更新を希望しない場合は、LocationManager.requestSingleUpdate()の亜種のうちの1つについて教えてください。

これらは、onLocationChanged()コールバック(またはIntentを介して)の位置情報アップデートを1つだけ提供します。それだけです。リスナーなどを取り消す必要はありません。

locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, Looper.getMainLooper()); 
+0

明らかに、私は、場所が決定されるとただちにrequestLocationUpdatesが私にアップデートを与えるという事実を忘れてしまった。私が理解している限り、テストしましたが、実際にはそれをテストしませんでしたが、実際には最小距離を移動するか、指定された時間間隔をおいて最初の更新を取得する必要がありました。 これらの説明に感謝します。 – Blueriver

1

よく私はあなたの仕事を行うためにonLocationChangedメソッドを使用すると思います。

このようにします。

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    updateUi(); 
    }` 

public void updateUi() { 
     try { 
      mlastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      if (mlastLocation != null) { 
       final double latitude = mlastLocation.getLatitude(); 
       final double longitude = mlastLocation.getLongitude(); 

       //using this cordinates you can initialize map 

       } 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 
    }` 
関連する問題