2010-11-30 51 views
1

我試圖解決一個小問題:配置通知的頻率請求位置更新

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

所以我認爲mLocationListener應該等待2個mainutes調用它onLocationChanged方法之前。不過,每次我發送geo fix更新到模擬器後,方法都會立即調用。我是否誤解了Android開發人員指南,是否必須使用定時器或類似的組織更新速率來滿足我的需求?

+0

從文檔:minTime - 通知的最小時間間隔,以毫秒爲單位。此字段僅用作節省電量的提示,位置更新之間的實際時間可能大於或小於此值。 – EboMike 2010-11-30 18:33:00

+0

soooo ...基本上我必須實現一些額外的機制來組織更新週期(基於minTime值)? – 2010-11-30 19:42:03

+0

不是。你在真實的設備上試過了嗎? – EboMike 2010-11-30 19:56:37

回答

1

那麼經過一番研究和冥想:)我已經想出了這樣的一個東西:一個服務,可以在兩種模式下運行(取決於listenPeriod變量):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; 
    } 

}

我希望這會幫助別人......) 附:感謝Dave MacLean和EboMike!並隨時提問;)

1

我覺得你對這些更新如何工作感到困惑。您無法告訴GPS硬件在未來的特定時間向您發送更新。你只能在你想要更新時給它指導。有了minTime,你說你不需要每2分鐘更新一次,但是當你設置你的監聽器時,你使用的是最小零距離。這告訴底層的GPS驅動程序在每當位置改變任何距離時向你發送更新。這就是爲什麼你在發送新的點時立即獲得更新。