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.
- Android "cerrar la fuerza" lo que exactamente sucede con la memoria
- Android: no se puede iniciar la intención de servicio: ¿no se encuentra?
- Android: El botón de superposición onClick nunca se llama
- Uso de GoogleApiClient en un servicio
- Cómo evitar que el servicio se ejecute de nuevo si ya está ejecutando android
<?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>
- Actualizar MusicPlayer SeekBar en servicio
- ¿Necesita un ejemplo de código sobre cómo ejecutar un servicio Android para siempre en segundo plano incluso cuando el dispositivo está durmiendo, como Whatsapp?
- Android geofencing cuando se mata la aplicación
- Llamar al método getIntent en servicio
- ¿Hay alguna forma de forzar a IntentService a no ser recreado?
- Puede un servicio de Android proporcionar dos interfaces para comunicarse con?
- Detectar si el usuario interactúa con el teléfono?
- Android Shared Service?
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).
- Copia de archivo de base de datos a sdcard en android
- Cerrar el cajón de navegación mediante programación de otra clase