El servicio de fondo necesita enviar la ubicación del GPS en el servidor

Tengo problema con mi aplicación de Android. Necesito una aplicación que envíe en segundo plano la localización del GPS cada 10 minutos al servidor (aquí tengo servicio de WCF que trabajo). La aplicación necesita enviar datos incluso si está cerrada. Así que creé un servicio (para fines de prueba) que me envía tiempo en el servidor. Pero cuando inserto mi código para obtener la ubicación GPS en mi servicio todo falla (se detuvo inesperadamente).

Tengo caña que necesitas poner algún receptor o algo pero nada hasta ahora funciona. Así que estaré muy contento si alguien me puede ayudar.

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.biromatik.GPS" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".ETMGPSServiceActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name=".MyApplication" > <service android:enabled="true" android:name=".MonitorService" > </service> <receiver android:enabled="true" android:name=".LocationReceiver" > <intent-filter > <action android:name="com.biromatik.intent.action.LOCATION" /> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest> 

Lo he hecho en mi aplicación para hacer lo mismo que me pidió.

En mi servicio agregué esto:

 @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); addLocationListener(); } private void addLocationListener() { triggerService = new Thread(new Runnable(){ public void run(){ try{ Looper.prepare();//Initialise the current thread as a looper. lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); Criteria c = new Criteria(); c.setAccuracy(Criteria.ACCURACY_COARSE); final String PROVIDER = lm.getBestProvider(c, true); MyLocationListener myLocationListener = new MyLocationListener(); lm.requestLocationUpdates(PROVIDER, 600000, 0, myLocationListener); Log.d("LOC_SERVICE", "Service RUNNING!"); Looper.loop(); }catch(Exception ex){ ex.printStackTrace(); } } }, "LocationThread"); triggerService.start(); } public static void updateLocation(Location location) { Context appCtx = MyApplication.getAppContext(); double latitude, longitude; latitude = location.getLatitude(); longitude = location.getLongitude(); Intent filterRes = new Intent(); filterRes.setAction("xxx.yyy.intent.action.LOCATION"); filterRes.putExtra("latitude", latitude); filterRes.putExtra("longitude", longitude); appCtx.sendBroadcast(filterRes); } class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { updateLocation(location); } } 

NOTA: Vea que utilizo MyApplication.getAppContext (); Eso es porque estoy usando mi propia clase de aplicación para agregar el contexto. Y luego tengo un BroadcastReceiver con esto:

 public class LocationReceiver extends BroadcastReceiver { double latitude, longitude; @Override public void onReceive(final Context context, final Intent calledIntent) { Log.d("LOC_RECEIVER", "Location RECEIVED!"); latitude = calledIntent.getDoubleExtra("latitude", -1); longitude = calledIntent.getDoubleExtra("longitude", -1); updateRemote(latitude, longitude); } private void updateRemote(final double latitude, final double longitude ) { //HERE YOU CAN PUT YOUR ASYNCTASK TO UPDATE THE LOCATION ON YOUR SERVER } } 

La clase de aplicación:

 public class MyApplication extends Application { private static Context context; /* (non-Javadoc) * @see android.app.Application#onCreate() */ @Override public void onCreate() { MyApplication.context=getApplicationContext(); } public static Context getAppContext() { return MyApplication.context; } } 

También en su manifiesto necesita agregar ambos:

 <application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".MyApplication" > //YOUR ACTIVITIES HERE... <service android:enabled="true" android:name=".LocationService" > </service> <receiver android:enabled="true" android:name=".LocationReceiver" > <intent-filter > <action android:name="xxx.yyy.intent.action.LOCATION" /> </intent-filter> </receiver> </application> 

Método para detectar si el servicio se está ejecutando Hago esto en mi primera Actividad:

 /** * Check location service. */ private void checkLocationService() { Log.d("CHECK_SERVICE", "Service running: " + (settings.getBoolean("locationService", false)?"YES":"NO")); if(settings.getBoolean("locationService", false)) return; Intent mServiceIntent = new Intent(this, LocationService.class); startService(mServiceIntent); } 

Obviamente, es necesario controlar SharedPreferences ( settings ) para establecer la variable locationService como true / false si el servicio está ejecutando (onStart) o no (onDestroy).

  • Conectar la aplicación android a asp.net mvc back-end
  • Manejo de la funcionalidad "Deslizar para salir" de la lista de aplicaciones recientes de ICS
  • No se puede llamar a runOnUiThread en un subproceso desde dentro de un servicio
  • Pasar parámetros a GcmTaskService
  • ¿Se puede anidar un servicio en una aplicación?
  • Servicio de Android interactuando con múltiples actividades
  • Ninguna llamada a onStartCommand () sigue al reinicio de un servicio bloqueado en Android 2.3
  • Lectura de múltiples características de un dispositivo BLE de forma sincrónica (método recomendado para Android)
  • Android Speech Reconocimiento de voz: Llamada repetida de SpeechRecognizer.startListening () falla en JB 4.1.2
  • Android: Multithreading-Bluetooth SPP / RFCOMM-Cómo mantener activo mi BluetoothSocket y OutputStream al cambiar Actividades
  • Cómo utilizar AsyncTask en Servicios en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.