web-dev-qa-db-ja.com

バックグラウンドサービスでのGoogle Play Services LocationClientの使用

私のアプリは、ユーザーの位置を定期的に追跡してサーバーに送信するように設計されています。最近、Google Play Services Location APIでコードを変更しました。

Locationclientを作成し、onStartCommandでサービスに接続しました

public int onStartCommand(Intent intent, int flags, int startId) {
    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    mLocationClient.connect();
    return START_STICKY;

}

onConnectedメソッドでは、位置情報リクエストを送信し、

@Override
public void onConnected(Bundle arg0) {
    System.out.println("Connected ...");
    mLocationClient.requestLocationUpdates(REQUEST, this);

}

REQUESTオブジェクトは、

 private static final LocationRequest REQUEST = LocationRequest.create()
      .setInterval(5*60*1000)      // 5 minutes
      .setFastestInterval(3*60*1000) // 3 minutes
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

問題は、

  1. onLocationChangedメソッドは、指定された間隔(5分または最速の間隔3分)で呼び出されません。私が見ることができるログから、そのコールは2回または3回しか呼び出されず、その後まったくコールされません(1時間後にチェックしました)。

上記のコードの問題は何ですか? (「切断」のログも表示できませんでした)

  1. これを解決するために、alarmmanagerを使用してタスクを定期的に呼び出そうとしました。次に、ブロードキャスト受信機からLocationclientを介して単一のロケーション更新を取得する方法。 (locationclient.getLastlocation()は最後に保存された場所のみを返しますが、新しい場所を要求していません)
38
ThiyagaB

バックグラウンドサービスの完全なソースコードは次の場所から入手できます。

https://Gist.github.com/blackcj/20efe2ac885c7297a676

OnStartCommandにスーパーコールを追加してみてください。

/**
 * Keeps the service running even after the app is closed.
 * 
 */
public int onStartCommand (Intent intent, int flags, int startId)
{
    super.onStartCommand(intent, flags, startId);

    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    {
        mLocationClient.connect();
    }

    return START_STICKY;
}
35
blackcj