2010-11-30 34 views
1

位置更新を要求するための通知の頻度を設定する: は、私は小さな問題を解決しようとしている

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000, 0, mLocationListener); 

は、だから私はmLocationListenerが、それは方法をonLocationChangedだ呼び出す前に2 mainutesを待つべきであると仮定しました。しかし、私がそれを行うたびに、ジオ・フィックス・アップデートをエミュレータに送信した直後にこのメソッドが呼び出されます。私はアンドロイドの開発者のガイドを誤解していましたか?必要なアップデートレートを整理するためにタイマーなどを使用する必要がありますか?

+0

docs:minTime - 通知の最小時間間隔(ミリ秒単位)。このフィールドは電力を節約するためのヒントとしてのみ使用され、ロケーション更新間の実際の時間はこの値より大きくても小さくてもかまいません。 – EboMike

+0

soooo ...基本的には、更新時に(minTimeの値に基づいて)周期性を整理するためのいくつかの余分なメカニズムを実装する必要がありますか? –

+0

本当にありません。あなたは実際のデバイスで試しましたか? – EboMike

答えて

1

私はこのようなものを思いつきました:(listenPeriod変数に依存して)2つのモードで実行できるサービス:1)座標を一度処理した後に自己をシャットダウンしますlistenPeriod = 0); 2)、サービスをシャットダウンするまで指定された速度(listenPeriod> 0)で処理を行います。

     GPSTracer.listenPeriod = 120000; 

         comp = new ComponentName(context.getPackageName(), GPSTracer.class.getName()); 
         GPSTracer.iGPSTracer = new Intent(context, GPSTracer.class.getClass()); 

         GPSTracer.iGPSTracer.setComponent(comp); 
         service=context.startService(GPSTracer.iGPSTracer); 

私はサービスを開始する前にlistenPeriod変数を初期化する必要があります。そして、サービスの一部は次のようになります。

public class GPSTracer extends Service { 

public static Intent iGPSTracer; 

public static volatile Location mLocation = null; 

public static volatile LocationListener mLocationListener = null; 

public static LocationManager mLocationManager = null; 

public static long listenPeriod = 0; 

Timer mTimer = null; 


Handler mHandler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     if(msg.arg1 == 1) 
     { 
      if(GPSTracer.mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
      { 
       GPSTracer.mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000, 100, GPSTracer.mLocationListener); 
      } 
      else if(GPSTracer.mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
      { 
       GPSTracer.mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 120000, 100, GPSTracer.mLocationListener); 

      } 
      else 
      { 
       List<NameValuePair> gpsData = new ArrayList<NameValuePair>(); 
       gpsData.add(new BasicNameValuePair("Error", "No location provider")); 
       stopSelf(); 
      } 
     } 
     else if(msg.arg1 == 0) 
     { 
      GPSTracer.mLocationManager.removeUpdates(GPSTracer.mLocationListener); 
     } 
    }; 
}; 

TimerTask selfStopTask = new TimerTask() { 

    @Override 
    public void run() { 
     stopSelf(); 

    } 
}; 

TimerTask mTimerTask = new TimerTask() { 

    @Override 
    public void run() { 
        //Message mMessage = new Message(); 
        //mHandler.sendMessage(mMessage); 
     if(mLocation == null) 
     { 
      mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if(mLocation == null) 
      { 
       mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

      } 
     } 
     if(mLocation != null) 
     { 
      List<NameValuePair> gpsData = new ArrayList<NameValuePair>(); 
      gpsData.add(new BasicNameValuePair("Latitude", (new Double(mLocation.getLatitude())).toString())); 
      gpsData.add(new BasicNameValuePair("Longitude", (new Double(mLocation.getLongitude())).toString())); 
      gpsData.add(new BasicNameValuePair("Provider", mLocation.getProvider())); 
     } 
     else 
     { 
      List<NameValuePair> gpsData = new ArrayList<NameValuePair>(); 
      gpsData.add(new BasicNameValuePair("Error", "Location is unknown")); 
     } 
    } 
}; 

@Override 
public void onCreate() {  
    mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE); 
    mLocationListener = new GPSListener(getApplicationContext()); 

}; 

@Override 
public void onStart(Intent intent, int startId) { 

    Message mMessage = new Message(); 
    mMessage.arg1 = 1; 
    mHandler.sendMessage(mMessage); 

    if(listenPeriod == 0) 
    { 
     mTimer = new Timer("GPSTask"); 
     mTimer.schedule(mTimerTask, 0); 
     mTimer.schedule(selfStopTask, 60000); 
    } 
    else if(listenPeriod>0) 
    { 
     mTimer = new Timer("GPSTask"); 
     mTimer.schedule(mTimerTask, 0, listenPeriod); 
    } 
}; 

@Override 
public void onDestroy() { 
    Message mMessage = new Message(); 
    mMessage.arg1 = 0; 
    mHandler.sendMessage(mMessage); 
      //GPSTracer.mLocationManager.removeUpdates(GPSTracer.mLocationListener); 
    iGPSTracer = null; 
    mTimer.cancel(); 
    mTimerTask.cancel(); 
    mTimer = null; 
    mTimerTask = null; 
    mLocationListener = null; 
    mLocationManager = null; 
}; 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

とLocationListenerの実装:

public class GPSListener implements LocationListener{ 

    Context context; 
    public GPSListener(Context appContext) { 
     context = appContext; 
} 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     //GPSTracer.mLocationManager.removeUpdates(GPSTracer.mLocationListener); 
     GPSTracer.mLocation = location; 
    } 

}私はそれが誰かを助けることを願っています

...) P.S. Dave MacLeanとEboMikeのおかげで!お気軽に質問してください;)

+1

ねえ、これらのGPSパラメータに関する記事: http://www.android10.org/index.php/articleslocationmaps/294-how-locationlistener-works-in-android 回答を探す人に役立つことを願っています –

1

アップデートの仕組みについては混乱していると思います。 GPSハードウェアに将来の特定の時刻にアップデートを送信するように指示することはできません。あなたはそれをいつ更新するかについてのガイドラインだけを与えることができます。 minTimeでは、2分ごとよりも頻繁に更新したくないと言っていますが、リスナーをセットアップするときには最小距離0を使用しています。これは、場所がどこからでも距離が変わるたびに更新を送信するように、基礎となるGPSドライバに指示します。だからこそあなたは新しいポイントを送るときにすぐに更新を得ています。

+0

まあ...私はそれを考え出したと思うので、私は自分の位置変数の実際の更新をorginizingのためのタイマーとtimertaskを使用することにしました –

関連する問題