2011-01-14 6 views
1

10 초마다 위치 데이터를 수집하기 위해 GPSDataCollectService를 작성했지만 HTC 휴대 전화에서 위치를보고하지 않았습니다. 아무도 날 도울 수 있을까?안드로이드에서 매 10 초마다 위치 데이터를 수집하는 방법

package com.android.example; 

import java.util.Calendar; 
import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 

public class GPSDataCollectorService extends Service { 

    private static final String TAG = GPSDataCollectorService.class 
      .getSimpleName(); 

    LocationManager locationManager; 
    LocationListener gpsLocationListener; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    private Timer timer; 

    private TimerTask collectTask = new TimerTask() { 
     @Override 
     public void run() { 
      Log.i(TAG, "Timer task doing work: " 
        + Calendar.getInstance().getTimeInMillis()); 
      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      gpsLocationListener = new GPSLocationListener(); 
      locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 10 * 1000L, 0, 
        gpsLocationListener); 
     } 
    }; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i(TAG, "Service creating"); 
     timer = new Timer("GPSDataCollectorTimer"); 
     timer.schedule(collectTask, 1000L, 10 * 1000L); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i(TAG, "Service destroying"); 
     locationManager.removeUpdates(gpsLocationListener); 
     timer.cancel(); 
     timer = null; 
    } 

    private class GPSLocationListener implements LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.d(TAG, "onLocationChanged: " + location.toString()); 
      locationManager.removeUpdates(gpsLocationListener); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.d(TAG, "onStatusChanged: " + status); 
     } 

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

     } 

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

     } 

    } 

} 

답변

0

위치가 10 초마다 변경되면 LocationManager 만 새 위치를 추적합니다. 그렇지 않으면 동일한 마지막 위치를 사용합니다.

+0

몇 가지 코드를 보여줄 수 있습니까? 감사! –

+0

내 위치가 계속 변경되었지만 배터리 전원 및 비용 사용을 고려한 위치 데이터를 얻은 후 위치 데이터를 요청하고 GPS를 닫으려면 매 10 초마다 GPS를 열려고합니다. –

0

대신 LocationListener를 사용하여, 당신은 어쩌면이 같은 것을 할 수 있고, TimerTask를 내 타이머를 사용할 수 있습니다 :

LocationManager lm = yourActivityReference.getSystemService(Context.LOCATION_SERVICE); 
String provider = lm.getBestProvider(new Criteria(),true); 
Location loc = lm.getLastKnownLocation (provider); 

나는 그것을 확인하지 않은,하지만 내가 할 경우 나는 것 알으십시오 ...

감사합니다.

EDIt : "고전적인"접근 방식으로 다시 시도하겠습니다.

public class GPSDataCollectorService extends Service { 

    private static final String TAG = GPSDataCollectorService.class 
      .getSimpleName(); 

    LocationManager locationManager; 
    LocationListener gpsLocationListener; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 


    @Override 
    public void onCreate() { 
     super.onCreate(); 
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     gpsLocationListener = new GPSLocationListener(); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000L, 0, gpsLocationListener); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i(TAG, "Service destroying"); 
     locationManager.removeUpdates(gpsLocationListener); 
    } 

    private class GPSLocationListener implements LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.d(TAG, "onLocationChanged: " + location.toString()); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.d(TAG, "onStatusChanged: " + status); 
     } 

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

     } 

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

     } 

    } 

} 

나는 당신이 위치 업데이트가 asynchronally 리스너를 호출하고 시간 제한을 설정할 수 있기 때문에, 어떤 Timer 필요하다고 생각하지 않습니다. 나는 안드로이드에서 GPS를 많이 사용하지는 않았지만 거기에 많은 예제가 있어야합니다.

+0

locationManager에서 requestLocationUpdates 메소드를 호출하지 않으면 안드로이드를 트리거하여 GPS_Provider를 시작하는 방법은 무엇입니까? 처음 getLastKnownLocation (GPS_Provider)을 호출하면 반환 된 위치는 null입니다. –

+0

음, 아마도 requestLocationUpdates도 호출해야합니다. 코드 조각을 테스트하지는 않았지만 코드에 더 많은주의를 기울이면서 기다려주세요. 올바른 방법이라고 생각하지 않습니다. – mdelolmo

관련 문제