9

私のアプリは LocationListener を使用して位置修正を 1removeUpdates()回取得し、その後は 1 分に 1 回 (バッテリーを節約するため) 取得します。問題は、ユーザーが内部に移動すると、継続的に信号を探し、より多くのバッテリーを消費することです。シグナルが 15 秒以内に取得されない場合に removeUpdates に使用できる Location Manager 内のパブリック メソッドを誰かが知っているかどうか疑問に思っていました。その後、ユーザーが屋外に戻るまで、5 分ごとに位置修正を確認します。これは理にかなっていますか?GPS 信号の取得をタイムアウトするより良い方法はないでしょうか? Location Manager のパブリック メソッドを調べましたが、それを行う方法が見つからないようです。助けてくれてどうもありがとう!-ドム

4

3 に答える 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 に答える