7

私たちのアプリでは、位置を追跡するために融合ロケーションプロバイダ(FLP)を使用しました。私たちは、アプリがロケーションコールバックが呼び出されなくなる状態になることがあることに気付きました。問題のアプリは主に2つのタブレット(ネクサス7とLG G-pad 8.3)で使用されます。この問題は両方のデバイスで発生しています。一般的には、デバイスをリセットすることで問題が緩和されるようです。私たちは、FLPを使用するためのベストプラクティスのほとんどに従うと考えています。しかし、私たちがFLPをどのように使用するかを示すこのサンプルコードをまとめる場合には、融合ロケーションプロバイダ - onLocationChangedの呼び出しが停止する

のGoogle APIクライアントを取得し、接続を呼び出す:

一度接続
m_googleApiClient = builder 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
m_googleApiClient.connect() 

我々は場所のコールバック用のリスニングを開始:

LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
    locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

@Override 
public void onConnected(Bundle bundle) { 
    m_fusedLocationProviderApi.requestLocationUpdates(m_googleApiClient, m_locationRequest, this); 
} 

は、ロケーション要求は次のようになります次に、コールバックを実装します。

@Override 
public void onLocationChanged(Location location) { 
    // set location member var and record timestamp. 
} 

問題が発生すると、エラーコールバックが発生しないように見えます。 Googleでは長時間GPSを受信して​​いないことを検出したときにgoogle apiクライアントでreset()を呼び出してみました。また、(getLocationAvailabilityを使用して)2秒ごとにタイマーを使用してロケーションの可用性を監視します。通常、ユーザーがデバイスをリセットすると(電源オン、電源オフ)、問題が解決されます。

私たちの質問は以下のとおりです。

  1. は、他の誰がFLPと、この問題に気づいていますか?
  2. ユーザーのリセットが不十分で問題を解決するために、さらに多くの方法がありますか?場所の更新のヘルプを削除するのが助かりますか?
  3. 問題を診断するために収集できる情報がありますか?
+0

私はまったく同じ問題を抱えています。 Google Playサービスのどのバージョンを使用していますか、それが違いを生むのではないかと思ったら、どのOSバージョンをお使いですか? –

+0

私は最近9.2を使い始めました。1とそこにまだ問題を見ていない(指が交差した)。 – noahd

+1

私は最近まったく同じ問題を抱えています。 Google Playサービスのバージョンをアップグレードして以来この問題が発生していますか?ありがとうございました。 –

答えて

3

私はデバイスの幅広いスペクトルに幅広くFusedLocationProviderと協力し、双方のローエンド&ハイエンドとているが、GPSデータがの間で悪いパッチを持っていた同様の問題を見てきました。このため、信頼性に関するこれらの問題に対応するために、いくつか変更を加えました(下記参照)。はこれ以降これらの問題を確認していません。私の経験で

、そのような問題の解決策は以下のとおりです。

  1. 更新プレイサービス:7.xの範囲内 私が使っていたAndroidのプレイサービスのバージョン - 8.xのとき私はこれらの問題がありました。

    ソル:最近では、プレイサービスの10.xのバージョンにアップデートするには、問題の解決に役立っています。これらの問題はアップデートのポストには見えていないので、あなたのケースでもこれが間違いなく理由の1つになる可能性があります。

  2. &堅牢Androidのサービスは、より信頼性の高い作り: これは、我々はGPSデータに停電を見て、デバイスの再起動や再セットアップの初期化中に、我々は一般的にサービスを再起動する主要な理由の一つです。したがって、サービスが再び開始されると、位置の更新が正常に再開される可能性があります。

    ソル

    私はバックグラウンドサービスの代わりにフォアグラウンドサービスを使用し、これは、ここまでのところ、最も信頼性の高いソリューションであるが、これはユーザーのための粘着性のUI通知が付属しています。このためでなければ、バックグラウンドサービスのヘルスチェック(実行中または強制終了)を維持することも良い選択肢になります。接続懸濁液/エラー に

  3. 再接続GoogleAPIClient IはGoogleAPIClient接続が中断またはので悪いネットワーク条件または他の理由でエラーが返される状況を見ています。私はこのことがロケーションデータの損失に直接的に影響するのかどうかを検証することはできませんでしたが、このケースでは非常にうまくいく可能性があります。これをサポートするために、このGoogleAPIClient接続の問題が発生した場合に、ロケーションの更新をリセットすることができず、これもあなたが遵守しているものです。

    ソル:サスペンションやエラー時にGoogleAPIClientの簡単な再接続は、この問題を解決することができます。

これらとは別に、この問題に関与している可能性がもう一つの理由があります:

デバイスのGPSが失わFIX]は デバイスがGPSの修正を失う時間があります。その結果、GPSの修復を取り戻すことができる時間までGPSデータが欠落していました。場所がGPS修正のために失われたかどうかを判断する方法は全くありません。デバイスのロケーション設定をリセットすると、デバイスがGPSフィックスを試みていることの影響があります。これはおそらくここでも理由があります。

免責事項:私はHyperTrack @ Androidデベロッパーですし、私たちは自分のアプリで位置情報機能を構築し、これらは、私たちが解決された問題の一種であるされている開発者のための場所スタックを開発しています。 SDKsを使用して同様のシナリオをテストしても問題が解決しない場合は、その根本原因を突き止めて問題を解決するうえでお手伝いします。

+0

詳細な回答に感謝します! – noahd

-2

あなたはこのようLocationSettingsをチェックしようとすることができます:

request = LocationRequest.create(); 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(request); 
    builder.setAlwaysShow(true); 
    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(apiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(@NonNull LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener); 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        try { 
         status.startResolutionForResult(context, REQUEST_CODE); 
        } catch (IntentSender.SendIntentException e) {} 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        break; 
      } 
     } 
    }); 

、それが解決しない場合は、Googleのプレイ・サービスをダウングレードしようとonActivityResult

switch (requestCode) { 
    case REQUEST_CODE: 
     switch (resultCode) { 
     case Activity.RESULT_OK: 
     // All required changes were successfully made 
     LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener); 
     break; 
     case Activity.RESULT_CANCELED: 
     // The user was asked to change settings, but chose not to 
     break; 
     default: 
     break; 
     } 
    break; 
} 

の設定要求を処理バージョン。

+0

はい私はこの設定チェックを知っています。私は設定に関する問題はないと思う...私は実際にほとんどの時間コールバックを取得します。問題は、コールバックが停止してデバイスをリセットして、デバイスを再度取得しなければならない状態になることがあることです。 – noahd