NullpointerException al llamar a getSystemService (Context.LOCATION_SERVICE) y onLocationChanged no se llama

Estoy intentando crear un servicio del fondo que actualice la posición actual de los gps. Estoy recibiendo una NullPointerException en la línea LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

HomeActivity lanza un servicio

 startService(new Intent(getApplicationContext(), ForHire.class)); 

Service (ForHire) crea una actualización de TimerTask

 public class ForHire extends Service { ... private Timer getUpdatesNow = new Timer(); private Updates updates = new Updates(getUpdatesNow); @Override public void onCreate() { ... getUpdatesNow.schedule(updates, God.KM20TIME); Log.v("Taxeeta", "Notification created"); } private class Updates extends TimerTask implements LocationListener { private Timer getUpdatesNow; public Updates(Timer newGetUpdatesNow) { super(); getUpdatesNow = newGetUpdatesNow; LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, God.KM20TIME, God.KM20DISTANCE, (LocationListener) this); } public void run() { ... //do some cleanup } @Override public void onLocationChanged(Location location) { Log.v("Taxeeta", "Location changed"); // do a update of the current location. } 

El primer problema es que obtengo esa NullPointerException. El segundo problema es que onLocationChanged nunca se llama si comento fuera LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, God.KM20TIME, God.KM20DISTANCE, (LocationListener) this); LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, God.KM20TIME, God.KM20DISTANCE, (LocationListener) this); Estas 2 líneas.

Mi Manifiesto

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <application ...> ... <uses-library android:name="com.google.android.maps" /> </application> 

Que me estoy perdiendo aqui ?

Editar: Values of KM20TIME = 5000 (5 segundos) y KM20DISTANCE = 1 ( KM20DISTANCE = 1 metro). Aparte del arreglo abajo, salí de mi casa, conseguí el GPS permitido y caminé de una esquina de mi balcón al otro. Me di cuenta de que mis gps (LSB) cambiaban mientras caminaba de una esquina a la otra cada 5 segundos.

Lo más temprano que se puede llamar new Updates(getUpdatesNow); Está dentro del método onCreate() su servicio. La simple razón es que getSystemService() requiere un Contexto válido que no existe antes de ingresar onCreate() .

Tratar:

 private Timer getUpdatesNow; private Updates updates; @Override public void onCreate() { ... getUpdatesNow = new Timer(); updates = new Updates(getUpdatesNow); 
 // Acquire a reference to the system Location Manager LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { Toast.makeText(getBaseContext(), "Last Location is found..", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getBaseContext(), "Last Location is not found..", Toast.LENGTH_LONG).show(); } LocationListener locationListener = new LocationListener() { public void onStatusChanged(String provider, int status, Bundle extras) { } public void onProviderEnabled(String provider) { Toast.makeText(getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show(); } public void onProviderDisabled(String provider) { Toast.makeText(getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT).show(); } @Override public void onLocationChanged(Location location) { Log.i("geolocation", "lat is : " + location.getLatitude() + " and " + location.getLongitude() + ""); Toast.makeText(getBaseContext(), "Location is Changed..", Toast.LENGTH_LONG) .show(); } }; // Register the listener with the Location Manager to receive location updates locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
 @Override public void onCreate() { new Updates(getUpdatesNow); ... getUpdatesNow.schedule(updates, God.KM20TIME); Log.v("Taxeeta", "Notification created"); } 
  • Obtenga la ubicación (coordenadas) periódicamente sin aumentar drásticamente el consumo de la batería
  • Servicio de Android con la ubicación de los servicios de Google Play que hace que la aplicación se abra al azar
  • Cómo obtener la ubicación de las coordenadas
  • Android Smart Location Library siempre está conectado a los gps después de la aplicación cerrada
  • Android Location Client no puede resolver el método
  • ¿Es Fused Location Provider buena opción?
  • Cambiar el modo de ubicación a alta precisión mediante programación Android
  • Uso de GoogleApiClient + LocationServices sin actualizar
  • cómo obtener longitud y latitud en android
  • Activación del modo de ubicación Alta exactitud o ahorro de la batería, programáticamente, sin necesidad de que el usuario visite Configuración
  • LocationManager's getBestProvider devolver null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.