私は cwac-locpoll を使用していますが、これは素晴らしい仕事をしています。ただし、一部のユーザーは次の問題を抱えています
java.lang.RuntimeException: WakeLock under-locked com.commonsware.cwac.locpoll.LocationPoller
at android.os.PowerManager$WakeLock.release(PowerManager.java:339)
at android.os.PowerManager$WakeLock.release(PowerManager.java:299)
at com.commonsware.cwac.locpoll.WakefulThread.onPostExecute(WakefulThread.java:59)
at com.commonsware.cwac.locpoll.LocationPollerService$PollerThread.onPostExecute(LocationPollerService.java:231)
at com.commonsware.cwac.locpoll.WakefulThread.run(WakefulThread.java:93)
LocationReceiver
ご覧のとおり、取得した場所をヘルパー クラスを介してアプリに保存するだけのクラスSharedPreferences
です。
public class LocationReceiver extends BroadcastReceiver {
private static final String TAG = "LocationReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = intent.getExtras();
Location loc = (Location) b.get(LocationPoller.EXTRA_LOCATION);
if (loc == null) {
loc = (Location) b.get(LocationPoller.EXTRA_LASTKNOWN);
if (loc == null) {
Log.w(TAG, "Unable to get location. " + intent.getStringExtra(LocationPoller.EXTRA_ERROR));
} else {
Log.w(TAG, "Timeout getting location, using previous one " + loc);
}
} else {
Log.i(TAG, "Got location " + loc);
}
// save location in preferences
if (loc != null) {
PrefsHelper.setLastLocation(loc.getLatitude(), loc.getLongitude());
}
}
}
WakefulIntentService
また、この最後の場所をフェッチして何かを行う別の cwac-wakeful も使用していますが、これらは独立して実行するように設計されています。言い換えると:
LocationReceiver
cwac-locpoll によって呼び出され、最後の既知の場所をときどき保存しSharedPreferences
ます。- A
WakefulIntentService
は (独立して) この場所を取得し、それを使用して何かを行うようにスケジュールされています。
ありがとう!