2012-03-26 2 views
4

여기에서 많은 질문을 읽었지만 문제가 무엇인지 알 수 없었습니다.안드로이드 안의 서비스 내 AlarmManager로주기적인 GPS 위치 업데이트

저는 Android 용 필드 서비스 응용 프로그램을 작성하고 있습니다. Activities (MyActivity.java) 중 하나에는 Start와 Stop이라는 두 개의 버튼이 있습니다.

현장 작업자가 시작 버튼을 누르면 GPS로 현재 위치를 가져 와서 적절한 시간 간격으로 서버에 보내야합니다 (기본값은 5 분, 여기서는 테스트를 위해 20 초로 설정). 고객은 직원이 트래픽에서 시간을 보내는 데 얼마나 오랜 시간이 걸린지 알기를 원하며 도시 (이스탄불)의 교통량은 엉망입니다.

내 활동에 AlarmManager가 있는데, 시작 버튼을 누르면 알람이 AlarmManager.setRepeating()으로 설정되어 서비스 (ServiceClass.java)가 시작됩니다.

Intent intent = new Intent (MyActivity.this, ServiceClass.class); 
mPendingIntent = PendingIntent.getService(MyActivity.this, 0, intent, 
               PendingIntent.FLAG_CANCEL_CURRENT); 
mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
mAlarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 20*1000, 
                    mPendingIntent); 

정지 버튼으로 알람을 취소합니다.

여기까지 완벽하게 작동하여 서비스가 시작됩니다. 그것의 onCreate(), onStart()onDestroy() 메소드가 실행됩니다. 그러나 나는 그 위치를 알 수 없다. DDMS를 사용하여 위치를 전송하기 위해 실제 장치에서 작업하지 않습니다. 그러나 응용 프로그램은 해당 단계를 건너 뛰고 내 위치의 경도 및 위도를 Lon : 0 Lat : 0으로 인쇄합니다.

public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    Log.d("Testing", "Service got started, calling location updates:"); 
    mLocationManager.requestSingleUpdate(mCriteria, mLocationListener, 
                   getMainLooper()); 
    Log.i("TESTING LOCATION UPDATE: LOCATION:", "\nLat:" + mLatitude + 
                  " Lon:" + mLongitude); 
    stopSelf(startId); 
    Log.d("Testing", "Service Stopped!"); 

그리고 마지막으로, 여기 내 LocationListener의 :

mLocationProvider = mLocationManager.getBestProvider(mCriteria, true); 
Log.i("BEST PROVIDER IS:", mLocationProvider); 
: 나는이 코드를 실행하면

또한
mLocationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 

      if(location != null){ 
       mLatitude = location.getLatitude(); 
       mLongitude = location.getLongitude(); 
       Log.i("onLocationChanged(Location location)", "Lat:"+mLatitude + " 
                  Lon:" + mLongitude); 
} 

무언가가 내 눈을 사로 잡은, 여기

서비스 내부의 코드입니다

그것은 BEST PROVIDER IS : gps라고합니다. 그러나 onProviderEnabled() 내부의이 로그는 logcat에 절대로 표시되지 않습니다. 내가 사용하는 경우

@Override 
public void onProviderEnabled(String s) { 
    Log.v("onProviderEnabled", "ENABLED"); 
} 

두 가지가 추가 :

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

그 중 하나가 작동하지 않습니다. 문제는이 작업을 수행하기위한 좋은 방법입니다, 모든

Location lastKnown = mLocationManager.getLastKnownLocation(
                LocationManager.GPS_PROVIDER); 

첫째 :

이 그러나 작동하고 나는 LastKnownLocation을받을 수 있나요? 그것이 내가 무엇을 놓치고 있는지 확인하시기 바랍니다. 그렇지 않다면 어떻게 구현할 수 있습니까?

감사합니다. :)

+1

안드로이드에서 더 나은 글쓰기 중 하나 인; http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html - 대부분의 궁금증을 해결합니다. – tonys

+0

@tonys 고마워요, 그 첫 번째 것을 읽을 것입니다. – Lev

+0

이것은 완벽하게 작동합니다 : [링크 설명을 입력하십시오] (http://stackoverflow.com/questions/21762293/run-gps-as-background-service-and-send-coordinates-to-web-server-php) –

답변

8

먼저 위치 업데이트에 등록한 다음 서비스를 종료하십시오. 기껏해야 스레드가 누출됩니다. 최악의 경우, Android는 프로세스를 종료하고 (아무 것도 실행되지 않는다고 생각하면) 업데이트를받지 못합니다. 또한 GPS를 워밍업하는 데 시간이 걸리므로 특히 도시 환경에서 20 초 이내에 문제가 해결되지 않을 수 있습니다. 또한 수정 사항을 수집하는 동안 장치가 깨어있는 상태인지 확인해야합니다.

결과적으로 백그라운드에서주기적인 위치 수정을 얻는 것은 다소 복잡한 문제입니다.

이 문제를 해결하기 위해 LocationPoller을 지금 작성했습니다. another developer has forked and extended it. 당신은 포크를 시도하거나 단순히 아이디어의 원천으로 사용할 수 있습니다.

+0

10 몇 분 후에 내가 당신의 LocationPoller를 발견했습니다. 소스를 다운로드하여 살펴보기 전에 전기가 나가 버렸습니다. :) 고마워. – Lev

+0

매니페스트에 등록 된 리시버가있는 'requestLocationUpdates (String provider, long minTime, float minDistance, PendingIntent intent)'에 같은 문제가 있습니까? 즉, PendingIntent를 전달하는 데 사용되는 'AlarmManager'입니다 (이 경우 수신자가 깨어납니다). –

+0

@Mr_and_Mrs_D : 죄송 합니다만, 귀하의 질문을 이해할 수 없습니다. – CommonsWare

1

이 시도 :

AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,,,); 

내가 GPS와 자신의 현재 위치를 얻기 위해하고있는 중이 야,하지만 내 프로젝트는 10 초마다 작동합니다. 나는 지금 전혀 모른다. 그리고 내 코드 :

AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),6000000,pi);