私のアプリは LocationListener を使用して位置修正を 1removeUpdates()
回取得し、その後は 1 分に 1 回 (バッテリーを節約するため) 取得します。問題は、ユーザーが内部に移動すると、継続的に信号を探し、より多くのバッテリーを消費することです。シグナルが 15 秒以内に取得されない場合に removeUpdates に使用できる Location Manager 内のパブリック メソッドを誰かが知っているかどうか疑問に思っていました。その後、ユーザーが屋外に戻るまで、5 分ごとに位置修正を確認します。これは理にかなっていますか?GPS 信号の取得をタイムアウトするより良い方法はないでしょうか? Location Manager のパブリック メソッドを調べましたが、それを行う方法が見つからないようです。助けてくれてどうもありがとう!-ドム
10507 次
3 に答える
8
GPSmaster の回答は受け入れられますが、よりエレガントでシンプルなソリューションへのリンクを投稿したいと思います - https://gist.github.com/777790/86b405debd6e3915bfcd8885c2ee11db2b96e3df。私はそれを自分で試してみましたが、うまくいきました=)
リンクが機能しない場合、これはamay077LocationListener
によるカスタムです:
/**
* Initialize instance.
*
* @param locaMan the base of LocationManager, can't set null.
* @param timeOutMS timeout elapsed (mili seconds)
* @param timeoutListener if timeout, call onTimeouted method of this.
*/
public TimeoutableLocationListener(LocationManager locaMan, long timeOutMS,
final TimeoutLisener timeoutListener) {
this.locaMan = locaMan;
timerTimeout.schedule(new TimerTask() {
@Override
public void run() {
if (timeoutListener != null) {
timeoutListener.onTimeouted(TimeoutableLocationListener.this);
}
stopLocationUpdateAndTimer();
}
}, timeOutMS);
}
/***
* Location callback.
*
* If override on your concrete class, must call base.onLocation().
*/
@Override
public void onLocationChanged(Location location) {
stopLocationUpdateAndTimer();
}
@Override
public void onProviderDisabled(String s) { }
@Override
public void onProviderEnabled(String s) { }
@Override
public void onStatusChanged(String s, int i, Bundle bundle) { }
private void stopLocationUpdateAndTimer() {
locaMan.removeUpdates(this);
timerTimeout.cancel();
timerTimeout.purge();
timerTimeout = null;
}
public interface TimeoutLisener {
void onTimeouted(LocationListener sender);
}
于 2013-04-10T08:37:00.540 に答える
4
これが私がやったことです。
これは私が LocationListener に追加したもので、グローバル変数 timertest と loccounter に注意してください:
public class MyLocationListener implements LocationListener
{
public void onStart() {
if (timertest==false) {
timertest=true;
serviceHandler = new Handler();
serviceHandler.postDelayed( new timer(),1000L );
}
}
class timer implements Runnable {
public void run() {
++loccounter;
if (runtest==true && loccounter>8) {
dt=200;
runtest=false;
stoplistening();
} else serviceHandler.postDelayed( this, 1000L );
}
}
}
位置情報の更新をリクエストする直前にタイマーを開始します。
public void locupdate(int minTime, float minDistance) {
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
if (mlocListener != null && mlocManager != null) {
mlocManager.removeUpdates(mlocListener);
}
loccounter=0;
((MyLocationListener) mlocListener).onStart();
runtest=true;
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
minTime, minDistance, mlocListener);
}
ロケーションリスナー内の最後のメソッド:
public void stoplistening() {
mlocManager.removeUpdates(mlocListener);
loccounter=0;
}
これが誰かを助けることを願っています
于 2011-04-20T22:50:18.010 に答える