2013-03-29 2 views
0

Start Service:onLocationChanged никогда не вызывается, даже после запроса обновлений

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent i = new Intent(this, LocationService.class); 
pi = PendingIntent.getService(this, 0, i, 
     PendingIntent.FLAG_UPDATE_CURRENT); 
am.cancel(pi); 
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     SystemClock.elapsedRealtime(), 30*1000, pi); 

Услуги:

public class LocationService extends Service implements LocationListener { 

    public static double curLat = 0.0; 
    public static double curLng = 0.0; 
    private LocationManager mgr; 
    private String best; 
    private Location location; 

    @Override 
    public IBinder onBind(Intent arg0) { 

     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     best = LocationManager.NETWORK_PROVIDER; 
     location = mgr.getLastKnownLocation(best); 
     if (location != null) { 

      dumpLocation(location); 
      mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
        5 * 1000, 0, this); 
     } 
     return START_NOT_STICKY; 
     } 
    } 

    private void dumpLocation(Location l) { 

     SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy:hh:mm:ss", 
       Locale.ENGLISH); 
     String format = s.format(l.getTime()); 
     //The above time is always 21/03/2013:09:53:41 which is more than a week old 
     curLat = l.getLatitude(); 
     curLng = l.getLongitude(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     //This never seems to be called 
     dumpLocation(location); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 
} 

Каждые 30 секунд служба вызывается, но requestLocationUpdates никогда не кажется для звонка onLocationChanged. И когда я проверил время lastKnownLocation его неделю.

Приложения, такие как foursquare, local, maps etc, отображают текущее местоположение с отключенным GPS.

Что мне не хватает?

+0

На стороне: обновление местоположения может возвращать нулевое местоположение. Обязательно справитесь с этим ... – Warpzit

+0

Вы тестируете устройство или эмулятор? ваш GPS включен? вы проверяете его снаружи, как среда открытого неба? – Lucifer

+0

@Warpzit, да. Но я получаю место. Что я дам и получаю отметку времени. –

ответ

1

Я думаю, вам нужно перемещаться откуда-то с вашего устройства, потому что onLocationChange только вызывается, если местоположение было изменено. И местоположение сети было приблизительно около 1000-2000 метров, поэтому нужно проверить на улице, где место было изменено и получить новое место. Если вы использовали gps, то он даст вам точную информацию, но он также находится на расстоянии 20-30 метров после того, как все это зафиксировано.

+0

+1, но не полностью согласен с расчетами счетчика, потому что, когда я использую NETWORK_PROVIDER, он дает результат даже с 5 метрами, но главное - это изменение местоположения (перемещение). – Lucifer

+0

Да, но любое другое приложение может дать точное местоположение (без GPS и без движения). Фактически на другом устройстве, хотя местоположение не изменяется, каждый раз, когда вызывается служба (30 секунд) onLocationChanged, и TimeStamp является текущим временем. –

+0

Я попытался перезапустить устройство. Теперь каждые 30 секунд onLocationChanged вызывается даже без перемещения, а новое местоположение похоже на точность 56 м, точность 55 м и т. Д. С крошечным изменением в lat lng. Может быть, это как-то связано с устройством. Но другие приложения заставляют меня задаться вопросом, как они могут найти место. Также может возникнуть одна и та же проблема спустя некоторое время. Любая идея, как решить такие случаи? –

Смежные вопросы