Spanish DOZE !!!!

EcoGus

Member
Licensed User
Longtime User
Hola,

He preparado una aplicación de Golocalización con mi aplicación movil. Y funciona bastante bien...aquí llega el pero...cuando lleva 2 minutos funcionando, exactamente, deja de guardar la posicion de geoloalización. El programa sigue funcionando, hago un registro de las veces que se ejecuta la aplicación cuando entra en reposo, utilizo un STARTSERVICEAT(y un periodo de tiempo de unos 10 segundos) y genera una archivo de texto donde se guarda la fecha y la hora con un texto para ver que el programa se va ejecutando.

He estado estudiando el tema y me he dado cuenta que hay una función en el ahorro de bateria, que si lo desactivo, funciona perfectamente. Al parecer se llama DOZE...

¿Sabeis cómo hacer para desactivarlo? ¿o cambiarle la configuración? Ya he probado con el KEEPALIVE, y no es la solución, pues no puedo dejar la pantalla apagada durante el proceso.
 

EcoGus

Member
Licensed User
Longtime User
Hola Descartex, gracias por la respuesta...pero no consigo entender que quieres que haga con el enlace que me pones.

Adjunto una captura del log que he se ha generado con el programa...

2018-03-30 11:21:15 Location Changhe LOCK
2018-03-30 11:21:15 Location Changhe LOCK
2018-03-30 11:21:15 Location Changhe LOCK
** Service (starter) Start **
2018-03-30 11:21:17 Start Service
2018-03-30 11:21:17 Location Changhe LOCK
2018-03-30 11:21:18 Location Changhe LOCK
2018-03-30 11:21:19 Location Changhe LOCK
2018-03-30 11:21:20 Location Changhe LOCK
2018-03-30 11:21:21 Location Changhe LOCK
2018-03-30 11:21:22 Location Changhe LOCK
2018-03-30 11:21:23 Location Changhe LOCK
2018-03-30 11:21:24 Location Changhe LOCK
2018-03-30 11:21:25 Location Changhe LOCK
2018-03-30 11:21:26 Location Changhe LOCK
2018-03-30 11:21:26 Location Changhe LOCK
** Service (starter) Start **
2018-03-30 11:21:28 Start Service
** Service (starter) Start **
2018-03-30 11:21:39 Start Service
** Service (starter) Start **
2018-03-30 11:21:51 Start Service
** Service (starter) Start **
2018-03-30 11:22:01 Start Service

En este caso he usado la libreria phone.PartialLock y se ve como el Servicio se va ejecutando, cada X segundos como le pongo, pero a los 2 minutos que, al parecer, entra en funcionamiento el ahorro de energia, el GPS deja de funcionar.

He conseguido hacerlo funcionar de dos formas una es con la función phone.KeepAlive, pero esto proboca un gran consumo de batería al estar la pantalla encencida. He intentado reducir el brillo de la pantalla a 0 (pero no se queda apagada del todo y además no consigo hacer que la pantalla recupere el brillo cuando devería hacerlo normalmente)
La otra es cambiando el uso de la batería de la aplicación y ponerlo que no lo apague. Esta solucion me parece la más correcta, pero tengo el problema de que los usuarios a los que dirijo la APP, no creo que sepan hacerlo...por lo que me gustaria poder hacerlo desde Manifest o desde la aplicación.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola,

He preparado una aplicación de Golocalización con mi aplicación movil. Y funciona bastante bien...aquí llega el pero...cuando lleva 2 minutos funcionando, exactamente, deja de guardar la posicion de geoloalización. El programa sigue funcionando, hago un registro de las veces que se ejecuta la aplicación cuando entra en reposo, utilizo un STARTSERVICEAT(y un periodo de tiempo de unos 10 segundos) y genera una archivo de texto donde se guarda la fecha y la hora con un texto para ver que el programa se va ejecutando.

He estado estudiando el tema y me he dado cuenta que hay una función en el ahorro de bateria, que si lo desactivo, funciona perfectamente. Al parecer se llama DOZE...

¿Sabeis cómo hacer para desactivarlo? ¿o cambiarle la configuración? Ya he probado con el KEEPALIVE, y no es la solución, pues no puedo dejar la pantalla apagada durante el proceso.

B4X:
Dim ScreenOn As PhoneWakeState
ScreenOn.KeepAlive(True) 'Mantiene pantalla encendida mientras este habierta la aplicación.

Mantiene la pantalla encendida mientras la aplicación esta abierta, la solución no es guardar un archivo de texto para ver si se va ejecutando la aplicación, tu solución es agregar un log el cual te permitirá ver con el IDE de B4A que esta haciendo la aplicación.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola EcoGus:

Ya ese problema parece que lo resolviste en este post:
https://www.b4x.com/android/forum/threads/seguimiento-por-gps.90279/#post-572629

Tienes un problema en el servicio, y quizas en la activación del gps, tengo aplicaciones que emplean sensores del dispositivo y como te comenté no hace falta en algunos que esté llamando al servicio constantemente, ya que si hay un evento cuando ocurra entrará en este, tambien te puse una opción para que Android no mate el servicio.
B4X:
#StartCommandReturnValue: android.app.Service.START_STICKY
Esto se emplea especialmente para seguimientos por GPS, puedes ver un pequeño tutorial que hice aqui:
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/

O el tutorial de Erel aqui:
https://www.b4x.com/android/forum/t...-long-running-background-tasks.27065/#content

La parte que Descartex te ha dicho es la que dice Erel:
Make your service a foreground service. It should prevent the OS from entering this mode.
(Haga que su servicio sea un servicio en primer plano. Debería evitar que el sistema operativo entre en este modo.)
Que básicamente es lo que te dije en el otro post

Por otro lado , y no se si es el caso, si no te mueves con el dispositivo es lógico que no salte el evento Change. Y como te dije en el otro post, llamar a un servicio cada 10 segundos hará que se te coma la bateria.

También puedes probar lo que hacen la mayoria de App que utilizan la ubicación, te las mantienen un servicio con un icono en la barra de estado, de esta forma el servicio no lo mata Android.

Saludos:
 

EcoGus

Member
Licensed User
Longtime User
B4X:
Dim ScreenOn As PhoneWakeState
ScreenOn.KeepAlive(True) 'Mantiene pantalla encendida mientras este habierta la aplicación.

Mantiene la pantalla encendida mientras la aplicación esta abierta, la solución no es guardar un archivo de texto para ver si se va ejecutando la aplicación, tu solución es agregar un log el cual te permitirá ver con el IDE de B4A que esta haciendo la aplicación.

Hola rscheel,
Ya he probado con el keepalive, pero con el parametro True, se queda la pantalla siembre encendida y con el parametro False, se apaga la pantalla, pero tambien deja de enviar datos GPS a los 2 minutos.
 

EcoGus

Member
Licensed User
Longtime User
Hola EcoGus:

Ya ese problema parece que lo resolviste en este post:
https://www.b4x.com/android/forum/threads/seguimiento-por-gps.90279/#post-572629

Tienes un problema en el servicio, y quizas en la activación del gps, tengo aplicaciones que emplean sensores del dispositivo y como te comenté no hace falta en algunos que esté llamando al servicio constantemente, ya que si hay un evento cuando ocurra entrará en este, tambien te puse una opción para que Android no mate el servicio.
B4X:
#StartCommandReturnValue: android.app.Service.START_STICKY
Esto se emplea especialmente para seguimientos por GPS, puedes ver un pequeño tutorial que hice aqui:
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/

O el tutorial de Erel aqui:
https://www.b4x.com/android/forum/t...-long-running-background-tasks.27065/#content

La parte que Descartex te ha dicho es la que dice Erel:
Make your service a foreground service. It should prevent the OS from entering this mode.
(Haga que su servicio sea un servicio en primer plano. Debería evitar que el sistema operativo entre en este modo.)
Que básicamente es lo que te dije en el otro post

Por otro lado , y no se si es el caso, si no te mueves con el dispositivo es lógico que no salte el evento Change. Y como te dije en el otro post, llamar a un servicio cada 10 segundos hará que se te coma la bateria.

También puedes probar lo que hacen la mayoria de App que utilizan la ubicación, te las mantienen un servicio con un icono en la barra de estado, de esta forma el servicio no lo mata Android.

Saludos:

Hola bgsoft,

He probado todo lo que he visto por los diferentes foros y lo que me has recomendado, pero sigue sin funcionar. Para que pueda funcionar tengo que sacar la aplicacion de la funcion de ahorro de bateria.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola rscheel,
Ya he probado con el keepalive, pero con el parametro True, se queda la pantalla siembre encendida y con el parametro False, se apaga la pantalla, pero tambien deja de enviar datos GPS a los 2 minutos.

Puedes adjuntar tu código para poder revisarlo?
 

rscheel

Well-Known Member
Licensed User
Longtime User
Si claro....


Consulta, que versión de android y b4a estas usando?

igual mirando tu código me doy cuenta que estas usando el servicio Starter, este servicio da muchos dolores de cabeza, es mejor crear un servicio nuevo y no usar el starter.
 

EcoGus

Member
Licensed User
Longtime User
Consulta, que versión de android y b4a estas usando?

igual mirando tu código me doy cuenta que estas usando el servicio Starter, este servicio da muchos dolores de cabeza, es mejor crear un servicio nuevo y no usar el starter.

Hola rscheel,

He probado a quitar el servicio Starter y me hace lo mismo.

La version de B4A que estoy usando es 7.80
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola EcoGus:

He vuelto a mirar tu código, y sigues con starter, ya te comenté en el otro post los problemas que da a veces, y rscheel tambien. Si pruebas con otro y no te va, busca que puede pasar, pero volver a poner el codigo en el starter no es buena idea, por que a veces da problemas y es mejor estar seguro que no empieza ahí. Aparte que como te dije, mirate el ciclo de vida con starter y veras que con el planteamiento de ese código te dará problemas.

Por otro lado en el otro post ya te dije las librerias que existen para el tema del doze, y tambien para el tema de la priorización del uso de energia, que tambien la puedes emplear. Te las vuelvo a poner:

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

Tambien, aunque es una obviedad, tu evento de GPS no se producirá si estas dentro de un edificio y no te mueves lo suficiente como para que exista una nueva localización que provoque el evento, por eso tambien en el otro post te comenté que lo ideal es utilizar la libreria LOCATIONMANAGER , me dijiste que no te era muy precisa, de ahi a que te comenté que ademas de utilizar requestMobileLocation utilizaras requestGPSLocation, yo la empleo y es superprecisa puesto que cuando hay cobertura utiliza GPS, y ademas provoca eventos cada vez que te mueves.

Yo iria paso a paso en las pruebas, cambiar muchas cosas al final no sabes que es lo que falla, pondria un nuevo servicio, borraria starter del proyecto, emplearia la API mas baja dependiendo de las necesidades que tengas, y haria pruebas de si Android te para el servicio cuando va a sleep. Como te dije en el otro post tengo servicios que estan funcionando siempre, y si ademas hay elementos de ese servicio que crean eventos se activan y entran en el servicio sin necesidad de llamarlo. Ademas de escribir log, crearia un fichero de "log" en el evento de cambio de ubicacion, de esa forma cuando te muevas y no estes conectado al PC podras ver que ha echo sin necesidad de conectarlo al pc y abrir el proyecto.

Y cuando hayas echo todo eso y no te funcione, cuelgalo y uno u otro lo miraremos y podremos decirte por que no te va (o al menos lo intentaremos), pero si pones algo antiguo, es dificil aconsejarte de que hacer aunque nos digas que ya lo probaste y no te funcionó, por que igual no te funcionó por alguna tonteria a nivel de código que no viste, nos pasa a todos, nos centramos mucho en algo y no vemos que estamos fallando en lo mas básico. De ahí salió la frase que los arboles nos impiden ver el bosque :D

Saludos
 

EcoGus

Member
Licensed User
Longtime User
Hola EcoGus:

He vuelto a mirar tu código, y sigues con starter, ya te comenté en el otro post los problemas que da a veces, y rscheel tambien. Si pruebas con otro y no te va, busca que puede pasar, pero volver a poner el codigo en el starter no es buena idea, por que a veces da problemas y es mejor estar seguro que no empieza ahí. Aparte que como te dije, mirate el ciclo de vida con starter y veras que con el planteamiento de ese código te dará problemas.

Por otro lado en el otro post ya te dije las librerias que existen para el tema del doze, y tambien para el tema de la priorización del uso de energia, que tambien la puedes emplear. Te las vuelvo a poner:

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

Tambien, aunque es una obviedad, tu evento de GPS no se producirá si estas dentro de un edificio y no te mueves lo suficiente como para que exista una nueva localización que provoque el evento, por eso tambien en el otro post te comenté que lo ideal es utilizar la libreria LOCATIONMANAGER , me dijiste que no te era muy precisa, de ahi a que te comenté que ademas de utilizar requestMobileLocation utilizaras requestGPSLocation, yo la empleo y es superprecisa puesto que cuando hay cobertura utiliza GPS, y ademas provoca eventos cada vez que te mueves.

Yo iria paso a paso en las pruebas, cambiar muchas cosas al final no sabes que es lo que falla, pondria un nuevo servicio, borraria starter del proyecto, emplearia la API mas baja dependiendo de las necesidades que tengas, y haria pruebas de si Android te para el servicio cuando va a sleep. Como te dije en el otro post tengo servicios que estan funcionando siempre, y si ademas hay elementos de ese servicio que crean eventos se activan y entran en el servicio sin necesidad de llamarlo. Ademas de escribir log, crearia un fichero de "log" en el evento de cambio de ubicacion, de esa forma cuando te muevas y no estes conectado al PC podras ver que ha echo sin necesidad de conectarlo al pc y abrir el proyecto.

Y cuando hayas echo todo eso y no te funcione, cuelgalo y uno u otro lo miraremos y podremos decirte por que no te va (o al menos lo intentaremos), pero si pones algo antiguo, es dificil aconsejarte de que hacer aunque nos digas que ya lo probaste y no te funcionó, por que igual no te funcionó por alguna tonteria a nivel de código que no viste, nos pasa a todos, nos centramos mucho en algo y no vemos que estamos fallando en lo mas básico. De ahí salió la frase que los arboles nos impiden ver el bosque :D

Saludos

Hola de nuevo...

Os adjunto el programa modificado (he creado otro servicio, he configurado el fusedlocationprovider y con la opcion de requestGPSLocation), así como el GPX que he hecho de prueba y en el que se aprecian 2 cosas:
1.- que cuando esta en población, a veces me coge la geolocalizacion de algun router o lo que sea y hace unos saltos (cosa que no hace la libreria de GPS)
2.- y por otro lado, que cuando pasan 2 minutos, entra el ahorro de energia y deja de coger la posicion GPS. He probado con la opción PRIORITY_HIGH_ACCURACY, que me parece que es la correcta para mi caso.

Igual me equivoco, pero sigo insistiendo, en que creo que debe de haber un comando para poner en el manifest y que saque al programa del sistema de ahorro energetico. Que es la única manera en la que lo he hecho funcionar.
 

Attachments

  • GPS Test.zip
    55.2 KB · Views: 329
  • aRuta 2018 PRIORITY_HIGH_ACCURACY. renombrar a gpx.txt
    12.2 KB · Views: 298
Top