8

これは、GPS 位置情報の更新をリッスンする方法です (LocationManagerとを使用LocationListener):

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
listener = new MyLocationistener(); // LocationListener
locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 
        30000, // milliseconds (minTime)
        20, // meters (minDistance)
        listener );

minTimeしかし、 で使用されるおよびminDistance引数を動的に調整したいと思いLocationManager#requestLocationUpdatesます。私の目的は、いくつかの使用ポリシーに従って、バッテリーを節約することです。

  • ユーザーが移動していない場合は、minTime を増やして位置情報の更新を取得します
  • ユーザーが非常に速く動いている場合は、minDistance を増やします
  • ユーザーが屋内にいる場合 (GPS がカバーされていない場合)、両方を増やします。
  • バッテリーが低すぎる場合は、両方を増やします
  • ... (その他のヒューリスティック)

私が知りたいのですが:

  1. これは本当にバッテリー寿命を節約するための良い考えですか?
  2. どうすればそのような調整を行うことができますか? 唯一の選択肢があれば、両方LocationManager#removeUpdatesを何度でも呼び出すことができます。LocationManager#requestLocationUpdates
  3. この種の適応アルゴリズムを実装するために知っているアイデアやサンプル コードはありますか?

編集: このアプリケーションは、特定の場所に最も近い人にタスクを割り当てるために、人がどこにいるかを知るための追跡システムです。実際にはバッテリーが8時間もつことはほとんどないので、増やしたいと思っています。

4

3 に答える 3

4

知る限り、何度も電話する必要がありremoveUpdatesますrequestLocationUpdates

また、加速度計など、電話が動いているかどうかを確認する他の方法を調べることもできます。ここでそれについて読んで、この他の質問の回答を参照してください

しかし、より多くのアイデアを得るには、問題そのものを提示する必要があります。問題が解決するまで、早すぎる最適化を試みないでください。ある場合は、それに関する詳細を投稿する必要があります。

于 2010-08-22T12:27:56.627 に答える
1

これは本当にバッテリー寿命を節約するための良い考えですか?

おそらくそうではありません。知る限り、GPS ラジオは常にオンになっています。これが、あなたが説明している最大のバッテリー消耗です。バッテリーを節約する方法は、アップデートを削除することです。これにより、GPS 無線がオフになります。ただし、次に位置情報の更新を要求するときは、GPS が最初の修正を取得するのに時間がかかります。

ユーザーが屋内にいる場合 (GPS がカバーされていない場合)、両方を増やします。

GPS を修正できない場合は、ラジオをオフにして、数分後に (または UI イベントなどに基づいて) 再試行してください。役に立たないのであれば、GPS をオンのままにしておく意味はありません。

バッテリーが低すぎる場合は、両方を増やします

バッテリー残量が少ない場合は、GPS をオフにします。低電力プロバイダーに切り替えるか (使用Criteriaしてプロバイダーを見つけます)、位置データを使用せずに移動します。好みによって何が「低すぎる」かをユーザーが判断できるようにします。

于 2010-08-22T12:24:49.503 に答える
1

私はこのようなことをしました:

LocationService がありました (拡張Serviceおよび実装LocationListener)。そして私は追加しました

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this);

および onLocationChangedListener で:

    public void onLocationChanged(Location location) {
        AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE);
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME
        Intent forceLoc = new Intent(LocationService.context,
                ForceLocationService.class);
        PendingIntent pendingForceLoc = PendingIntent.getService(
                LocationService.context, 0, forceLoc,
                PendingIntent.FLAG_ONE_SHOT);
        // CANCEL PREVIOUS alarm and set new one
        aleManager.cancel(pendingForceLoc);
        aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc);
    }

ForceLocationService (extends IntentService) では、通常のロケーション リスナーを次のようにトリガーします。

locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService);

これにより、次のことができます。

  1. alarmManager が ForceLocationService をトリガーする前にシステムが場所の更新を取得すると、自動的に更新が取得され、アラームがリセットされます。

  2. アラームがトリガーされるまで更新を取得しない場合は、アラームを強制的にトリガーすることで、必要なときに更新を取得できるようにします。

私が持っている唯一の問題は、アラームのリセットが onLocationChanged() で行われるため、場所に変更がない場合は機能しないことです。

于 2012-12-10T15:19:47.370 に答える