2010-11-30 10 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 변수에 따라 다름)로 실행할 수있는 서비스를 내놓았습니다. 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하기 위해 타이머와 팀 태그를 사용하기로 결정했습니다. –

관련 문제