Spanish Seguimiento por GPS

EcoGus

Member
Licensed User
Hola, a ver si me podeis echar una mano.
Hace un año hice una aplicacion que recogia los puntos GPS y me los envia a una base de datos en MYSQL. Me funcionaba perfectamente...hasta que cambie de telefono.
Anteriormente tenia una version de Android 4.2 y ahora tengo un dispositivo con Android 7.0.

El problema que tengo con el nuevo dispositivo, es que aunque entra el servicio perfectamente, cada 10 segundos, no realiza el proceso de localicazion "Sub GPS_LocationChanged (Location1 As Location)" esto me ocurre cuando el telefono entra en reposo, mientras esta encendido no hay problema.

He intentado usar las librerias FusedLocationProvider y b4aLocationManager, pero no he conseguido hacerlo funcionar.

¿pueden echarme una mano?

Gracias.
 

Attachments

  • GPS Test.zip
    54.7 KB · Views: 257

bgsoft

Well-Known Member
Licensed User
Hola:

Como decia Jack el destripador "vayamos por partes" :D

He visto varios errores en el codigo, pero no vamos a entrar en eso. Vamos por el problema de tu post

Si quieres crear un servicio, mejor no emplees Starter, da muchos problemas, por otro lado Starter se va a inicializar nada mas poner en marcha la aplicacion, mirate esto y lo entenderás:
https://www.b4x.com/android/forum/t...-el-módulo-de-servicio-starter.66596/#content

Cuando existe un evento, no hace falta que llames al servicio cada x tiempo, si el servicio está en marcha, cuando se produzca el evento entrará.

Cuando pares un servicio, ademas del StopService(Starter) (de tu App) haz un CancelScheduledService(Starter) , por que de esa forma si existen llamadas pendientes con tu StartServiceAt("",DateTime.Now + 10000,True) las quitaras y evitaras que vuelva a entrar.

Tu App funciona en Android 7 sin tocar nada (la he probado) la culpa es del señor Google, que al comprar Android, todo lo referente a ubicación lo cambió para sus intereses y si no activas la ubicación, por mucho que tu hagas un lGPS.requestMobileLocation si no tienes activa la ubicación no se producirá el evento :D, por eso no te funciona. Pon un logs en el evento Sub dGPS_locationchanged(Location1 As Location) y veras que cuando actives la ubicación entrará.

Saludos
 

EcoGus

Member
Licensed User
Perdona bgsoft, a que te refieres con activar la ubicación

A la opción de ubicación del Programa,del dispositivo, de Google?
 

bgsoft

Well-Known Member
Licensed User
Hola, la ubicación del dispositivo es lo que tienes que activar, normalmente está en la barra de arriba, en Android 7 por defecto es el segundo icono empezando por la izquierda (al menos en un Samsung)

Saludos
 

EcoGus

Member
Licensed User
Hola, creo que ya lo tenia activado...adjunto las fotos.
Mi telefono es un MII Xiaomi, pero aun así no funciona.

Estoy probando a que cuando el programa detecte que se entra en _PAUSE se ponga en marcha STARTSERVICEAT con 10 segundos. Una vez que vuelve a ejecutarse el SERVICE_START, realizo un PHONE_KEEPALIVE(false) para que el telefono vuelva a entrar en funcionamiento y obligue a realizar el cambio de ubicacion del GPS.

El problema que tengo con este sistema, que voy a probar si funciona hoy mismo, es que se ve un parpadeo en la pantalla. Intento hacer un SetScreenBrightness(0) para que no se vea encenderse la pantalla, pero da error al ejecutarlo desde el servicio.

Hago la prueba y os comento si funciona.
 

Attachments

  • IMG-20180307-WA0000.jpg
    IMG-20180307-WA0000.jpg
    133.7 KB · Views: 292
  • IMG-20180307-WA0001.jpg
    IMG-20180307-WA0001.jpg
    78 KB · Views: 276

EcoGus

Member
Licensed User
Hola dbsoft,

He hecho la prueba y me funciona bien...
He hecho que se ejecute el servicio cada 30 segundos y en el STARTSERVICE le coloco una opcion de KEEPALIVE y KEEPALIVERELEASE, os dejo la aplicacion por si quereis usarla y perfeccionarla a vuestro gusto. Tengo que ajustar un poco la opcion del brillo de la pantalla, pero me funciona bien. Lo unico que voy a volver a la libreria de GPS en vez de LOCATIONMANAGER, pues me coge puntos fuera de la ruta por la que voy, entiendo que coge los repetidores en vez de la posicion GPS real.
 

Attachments

  • GSP Test.zip
    56.1 KB · Views: 346

bgsoft

Well-Known Member
Licensed User
Hola dbsoft,

Lo unico que voy a volver a la libreria de GPS en vez de LOCATIONMANAGER, pues me coge puntos fuera de la ruta por la que voy, entiendo que coge los repetidores en vez de la posicion GPS real.


Hola, como hiciste un requestMobileLocation coge los datos de las redes (wifi, gsm, etc) añadele requestGPSLocation y empleará el GPS y tendrás mas precisión, lo bueno es que si mantienes los dos y estas en un edificio te dará la posición por triangulación, cosa que no te hará si lo haces solo con GPS.

Saludos
 

EcoGus

Member
Licensed User
Hola bgsoft,

Acabo de encontrar el problema...a ver si me puedes echar una mano.

El problema esta en el ahorro de batería. Al parecer es una nueva funcion que tiene Android desde la version 6.0 que llaman DOZE. Si entro en la configuración de ahorro de energia de la batería y excluyo el programa que estoy preparando, el sistema recoge datos sin parar.

Sabes si hay algun modo de quitar el programa de este ahorro de energia? o una función del MANIFEST?

Gracias.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Hola:

Tendrias que mantener "despierto" el dispositivo para que no vaya a modo sleep . (hay varios post en este foro sobre eso)

No se si lo has puesto, pero puedes poner esto en el servicio para que Android no lo mate:
B4X:
#StartCommandReturnValue: android.app.Service.START_STICKY

Existe una libreria (FusedLocationProvider) que puedes priorizar el uso de energia: https://www.b4x.com/android/help/fusedlocationprovider.html#priority

Aqui puedes encontrar información sobre DOZE : https://developer.android.com/training/monitoring-device-state/doze-standby.html

Si con todo esto no lo consigues, lo mejor seria que abrieras un nuevo post ya que desde dentro de este será dificil que los compañeros del foro vean esta nueva pregunta.

Saludos
 

benji

Active Member
Licensed User
con la libreria PhoneWakeState, tienes el comando Awake.KeepAlive(True), con lo cual siempre esta despierto... hay que tener en cuenta con esto, el drenaje de la libreria
 
Top