android - tiempo - seleccionar aplicacion de ubicacion de prueba huawei
Cómo enviar la ubicación del dispositivo en el servidor cuando sea necesario (2)
Aquí esta lo que hice.
Busque y almacene ubicaciones utilizando el proveedor de ubicación fusionada de servicios de Google Play como se describe aquí aquí
Evitaría configurar un servicio, en su lugar debería activar una alarma que solicite la última ubicación disponible. Esto ahorra aún más batería ya que la aplicación no busca un valor de ubicación, sino que utiliza lo que otras aplicaciones podrían haber solicitado recientemente. En mi opinión, la respuesta recibida es bastante precisa ... así que haz algo como esto
public class LocationReceiver extends BroadcastReceiver { // Restart service every 30 seconds private static final long REPEAT_TIME = 1000 * 60 * 5; private static final long REPEAT_DAILY = 1000 * 60 * 60 * 24; @Override public void onReceive(Context context, Intent intent) { Log.v("TEST", "Service loaded at start"); AlarmManager service = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Calendar cal = Calendar.getInstance(); cal.add(Calendar.SECOND, 0); Intent i = new Intent(context, ServiceStartReceiver.class); PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,PendingIntent.FLAG_CANCEL_CURRENT); service.setInexactRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), REPEAT_TIME, pending); } }
Como no ha mencionado que desea las actualizaciones en tiempo real, creo que puede volcar todos los datos en una base de datos sqlite temporal.
Cree un receptor para escuchar los cambios en la red y cuando esté sobre wifi simplemente envíe todos los datos a su servidor. Puede ser un poco más inteligente al hacer esto enviando solo cuando se haya acumulado cierto número de entradas o en un intervalo periódico.
Alternativamente, el servidor puede enviar un ping a la aplicación a través de una notificación de GCM que también puede activar el envío de datos a su servidor. este es un tutorial increíble para describir el envío de mensajes GCM a la aplicación.
Finalmente, se mencionan algunas estrategias de ubicación muy interesantes aquí . Puede ver cuándo activar su ubicación guardada según la actividad del usuario o algún otro contexto.
Espero que esto ayude.
Estoy desarrollando una aplicación en la que necesito latitud y longitud actuales del dispositivo. El tiempo para obtener la latitud / longitud será decidido por el servidor. El servidor enviará una notificación cada vez que se requiera recuperar lat / lang. Cuando el dispositivo recibe una notificación del servidor, al mismo tiempo el dispositivo envía su ubicación al servidor.
Algunas condiciones:
Quiero lat / long incluso si el dispositivo no tiene gps
si el usuario no toca ni hace clic en la notificación, entonces también quiero buscar latitud / longitud, es decir, incluso si el dispositivo está en modo de suspensión.
Además, no quiero ejecutar un servicio en segundo plano durante todo el día, ya que consume la batería del dispositivo.
Definitivamente recomendaría usar Google Cloud Messaging
aquí. Esto tiene la ventaja de que una vez que un dispositivo ejecuta su aplicación, puede hacer que se registre en GCM
y puede enviarles un mensaje que los haga registrar sus coordenadas en su base de datos.
Este enfoque necesitaría que tenga que implementar algún servidor (por ejemplo, un servidor web con PHP) y hacer que los usuarios se comuniquen con él, para que el flujo sea:
Su servidor envía un mensaje de difusión a todos los dispositivos registrados diciéndoles que tienen que registrarse en el servicio
GCM
.Los dispositivos reciben el mensaje e implementa
BroadcastReceiver
para obtener latitud y longitud y enviarlo a su servidor remoto, por ejemplo,http://www.mysuperserver.com/getlonglat.php
, a través de una solicitudPOST
.Su servidor toma ambos parámetros y los guarda o hace lo que necesita.
Si desea seguir este enfoque, estos son los pasos que debe seguir:
Vaya a https://console.developers.google.com . Con su cuenta de Google, registre un nuevo proyecto. Esto le proporcionará una clave de API y una ID de remitente.
Tendrá que hacer que el dispositivo se registre contra su proyecto en
GCM
. Puede lograr esto al importar los servicios deGoogle Play Services
dentro de su proyecto, y una vez hecho esto, haga algo similar a esto:GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); final String regid = gcm.register("YOUR_SENDER_ID");
En este momento, el servidor de
GCM
ya sabe que este usuario se ha registrado dentro de su proyecto y le ha dado unregid
.El siguiente paso es informar a su propio servidor remoto que el usuario lo ha hecho, y guardar en algún lugar el
regid
que se le ha asignado, para que luego pueda enviarle mensajes. Entonces, en el lado del cliente, haga una solicitudHTTP POST
contra su servidor enviando eseregid
y trátelo con algo como esto:$regid = $_POST[''regid'']; if (($regId) && ($ipAddr)) sql_query("INSERT INTO gcm_subscribers(regid) VALUES($regid'')");
Una vez hecho esto, ya sabes quién ya se ha registrado contra tu base de datos. Puede
SELECT
todos los usuarios y enviarles una señal para que le devuelvan sus coordenadas. En el siguiente ejemplo, los parámetros serían, en primer lugar, una matriz de ID de registro y, en segundo lugar, el mensaje a enviar (por ejemplo,$messageData = "sendMeYourCoords!"
).function sendNotification($registrationIdsArray, $messageData) { $apiKey = "YOUR_API_KEY"; $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey); $data = array( ''data'' => $messageData, ''registration_ids'' => $registrationIdsArray ); $ch = curl_init(); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" ); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data) ); $response = curl_exec($ch); curl_close($ch); return $response; }
Una vez que esté en su cliente, simplemente procese ese mensaje
GCM
y haga otraPOST
a otraURL
en su servidor remoto y páselo por lalongitude
y lalatitude
. Para procesar los mensajes, incluyo algunos enlaces a continuación.
Y para obtener las coordenadas sin GPS parece que no hay demasiadas soluciones, pero hay algunas. Este sería un ejemplo: ¿Cómo obtener el valor Latitud Longitud sin usar GPS en Android?
Más sobre esto: