2016-02-17 7 views
10

私は、デバイスの現在の場所を見つけるために使用される1つのアプリケーションを開発しました。私はFused Location APIを使用して現在地を取得しています。アプリケーションが開いているまで間違った場所になっているGoogleマップアプリケーション

私は非常に奇妙な問題に直面しています。一部のデバイスでは、私はinbuilt Googleマップを開くまで正確な現在地を取得していません。

ここに私のロケーションリクエストがあります。

mLocationRequest = new LocationRequest(); 
mLocationRequest.setInterval(UPDATE_INTERVAL); 
mLocationRequest.setFastestInterval(FATEST_INTERVAL); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters 

誰かが間違っていることを教えてもらえますか?あなたの助けは本当に感謝しています。

+0

あなたなLocationRequestは何ですか? –

+3

あなたは33kポイントを得ました。私は具体的な価値を推測する必要がありますか?コメントにない質問に入れてください。電話機の設定で高精度を有効にしましたか?いくつの位置情報を受け取ったのですか?どのデバイスをテストしましたか? GMSライブラリのバージョンは何ですか?あなたが考えることができるものは何でも役立ちます。 –

+1

5年間メンバーになっていて、コメントにコードを投稿しています。ああ、男の子... – 2Dee

答えて

3

だから私は過去にFusedLocationを使っていましたが、多くの問題に直面していました。 APIが壊れています。正しく機能しないデバイスがいくつかあります。多くのリレーを融合させ、働くことができず、スタッフを適切に認識する活動認識。 ロケーションマネージャAPIに戻って終了します。ここで

スニペット:

初期ロケーションマネージャと異なるスレッド上で更新を要求し始めます。 私は個人的に各プロバイダ

if (mLocationManager == null) { 
     LOGGER.info("Location track,start called first time. Creating Location Manager"); 
     mLocationManager = (LocationManager) mContextWeakReference.get() 
       .getSystemService(Context.LOCATION_SERVICE); 

     mLocationHandlerThread 
       = new HandlerThread("LocationThread", Thread.NORM_PRIORITY); 
     mLocationHandlerThread.start(); 
     // Now get the Looper from the HandlerThread 
     // NOTE: This call will block until the HandlerThread gets control and initializes its Looper 
     Looper looper = mLocationHandlerThread.getLooper(); 
     Location networkLastKnownLocation = null; 
     Location gpsLastKnownLocation = null; 
     mGpsLocationListener = new GpsLocationListener(); 
     mNetworkLocationListener = new NetworkLocationListener(); 

     // Register the listener with the Location Manager to receive location updates 
     if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
        LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, 
        mGpsLocationListener, 
        looper); 

      gpsLastKnownLocation = mLocationManager 
        .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     } else { 
      setGpsProviderAvailable(false); 
     } 
     if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) { 
      networkLastKnownLocation = mLocationManager 
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
        LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, 
        mNetworkLocationListener, 
        looper); 
     } 

     setLastKnownLocationDifferentProviders(gpsLastKnownLocation, 
       networkLastKnownLocation); 

    } 

用に別のリスナーを登録し、リスナーがある:

public class GpsLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.GPS_PROVIDER: 
       if (mLocationManager != null) { 
        mLocationManager.removeUpdates(mNetworkLocationListener); 
       } 
       break; 
     } 
     setLastKnownLocation(location); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

public class NetworkLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.NETWORK_PROVIDER: 
       setLastKnownLocation(location); 
       break; 
     } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

がすべてのスレッドの登録を解除し、停止するのを忘れないでください:)

+0

このリスナーには常に別のスレッドが必要ですか?私のユーザーは比較的ゆっくりと歩きますが、高頻度の更新は必要ありません。また、場所を単純にプッシュして処理します。UIスレッドには何も表示されません。 –

+0

別の質問:「間違った」ロケーション更新をフィルタリングする方法のこの全知恵があります。 –

+1

1.これのために別のスレッドは必要ありません。あなたは同じUIスレッドを使用してonLocationChangeを得ることができます 2.それは全体の話です:)悪い場所をフィルタリングする方法を書いておく必要があります –

0

私はこれについてはわかりませんが、最後に私はこのようなものを見たことがあり、その携帯電話には専用のGPSが搭載されていませんでした。それはa-GPSしか持っていなかった。

これは私が正確な位置を取得していなかった理由であることがわかったので、しかし、地図を開くと、何らかの理由で場所が正確になりました。携帯電話に専用のGPSが搭載されていない場合でも、地図上に正確な場所を取得するために、Googleは地図上​​に他の多くのことを間違いなく実行します。デバイスとそのハードウェア仕様を確認するだけです。

0

LocationRequestを作成するときに、setPriority()にPRIORITY_NO_POWERを設定する必要があります。

PRIORITY_NO_POWERは、携帯電話の他のアプリが場所を要求して受信しない限り、あなたのアプリが決してどこの場所も取得しないことを意味します。 LocationRequestで詳しく読む。

+0

どのようにして問題を確実に*再現*することができ、どのように修正できるかを示します。 –

0

あなたはMarshmallow以上のバージョンのデバイスでテストしていますか?
Lollipopよりも上のデバイスでは、実行時にロケーション権限を要求する必要があります。このリンクを参照してくださいhttp://developer.android.com/training/permissions/requesting.html
あなたの所在地の許可がないため正確な場所は返されませんが、すでにGps権限を持っているマップアプリを起動すると、Googleプレイサービスで現在地が更新されます。したがって、最終的にGoogleプレイサービスから場所が取得されるため、正しい場所が表示されるようになります。

+0

これは間違っています。アプリはLollipopをターゲットに設定しているため、Marshmallow上でさえ、権限は古い方法で動作します。また、ロケーションの更新は到着しますが、地図の精度はそれほど正確ではありません。また、私がfusedからGPSロケーションプロバイダに切り替えると、アップデートは正常に機能します。 –

関連する問題