Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

232
Visualizações
Ejecute el servicio para recopilar datos del sensor solo cuando el usuario se está moviendo

Quería rastrear los datos del sensor (acelerómetro, giroscopio) cuando el usuario se está moviendo/el teléfono no está parado.

Cosas que pude hacer:

  1. Escuche los datos del sensor usando Sensor Listener
 sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager val accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) sensorManager.registerListener( accSensor, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL )
  1. Ejecute un servicio de primer plano que siempre se ejecuta en segundo plano para rastrear los sensores incluso cuando la aplicación se elimina de las aplicaciones recientes
 serviceIntent = Intent(context, SensorService::class.java) context.startForegroundService(serviceIntent)
  1. Inicie el servicio tan pronto como la aplicación se reinicie utilizando oyentes de transmisión que escuchan el evento de arranque completado.

Pero no pude:

  1. Servicio de sensor de parada que recopila datos del sensor cuando el dispositivo deja de moverse.
  2. Iniciar sensor (que no se está ejecutando) cuando el dispositivo del usuario comienza a moverse y recopilar datos del sensor.

¿Cuál podría ser la forma de recibir las notificaciones/devolución de llamada de inicio y fin de movimiento del sistema para que podamos decidir iniciar/finalizar los servicios en primer plano?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Demasiado grande para un comentario, así que lo publicaré como respuesta. Y es en cierto modo una respuesta, pero sin pruebas, solo mi experiencia.

No soy de ninguna manera un experto en Android. Pero sé un par de cosas sobre los sensores en general. Y lo principal es que siempre están activos (por no decir apagados del todo), y que siempre hay algo de ruido . Asi que

  1. No se puede decir con 100% de certeza si hay movimiento o no. En su lugar, debe recopilar todos los eventos, elegir sus umbrales y decidirlo usted mismo . (Probablemente desee agregar las mediciones de varios sensores para tomar esa decisión, e incluso considerar el historial de mediciones; por ejemplo, si un usuario está en un automóvil en una carretera llena de baches, el ruido será mayor durante un período prolongado).
  2. Prácticamente no hay diferencia en el consumo de energía si el sistema operativo o su servicio ejecutarán el código correspondiente. Pero hay muchas más oportunidades para personalizar los umbrales, la agregación y otra lógica con su código. Es por eso que creo que el sistema operativo mantiene la API al mínimo, y no hay eventos tales como moving starts de moving stops .
  3. Lo único que consume energía por encima del mínimo es su código . Y nadie más, pero su código decide molestar a los usuarios con un flujo constante de notificaciones o no.

Por lo tanto, piense en la estrategia de agregación y los umbrales, no muestre notificaciones si no se superan los umbrales y haga que su código sea rápido (para que no use demasiada energía). Y ya está... más o menos... porque estas decisiones no son fáciles de tomar. Muchas aplicaciones de grandes empresas no logran hacerlo bien en todos los casos. Simplemente instale un par de aplicaciones de podómetro y verá que todas mostrarán diferentes conteos de pasos.

over 4 years ago · Santiago Trujillo Relatório

0

Los umbrales de lo que es 'movimiento' dependen de su aplicación, por lo que no hay muchas opciones preparadas (por ejemplo, ¿le importa si el usuario sacude su teléfono o simplemente si se mueve en un automóvil por algunas calles?).

Hay tipos de sensores que detectan el inicio/parada del movimiento. Ver aquí Si son buenos o no para su aplicación depende de su aplicación.

  1. Sensor de parada:

TYPE_STATIONARY_DETECT un evento cuando el usuario no se ha movido durante 5 segundos. Escúchelo y utilícelo para detener su servicio. Si quieres más rápido que eso, tendrás que hacerlo tú mismo.

  1. sensor de arranque

TYPE_MOVEMENT_DETECT es lo opuesto a detección estacionaria y se activa cuando el usuario se ha estado moviendo durante 5 segundos. Puede escuchar esto para iniciar el servicio nuevamente si la latencia de 5 segundos no es un factor decisivo.

El tipo SIGNIFICANT_MOTION también se puede usar si desea que su movimiento active la aplicación del modo de suspensión, pero nunca he tenido mucha suerte para encontrar lo que cuenta como "significativo" para ese tipo de sensor.

Si su movimiento no es una de esas dos cosas, un movimiento sostenido de 5 segundos o lo que sea que active la bandera 'significativa', entonces deberá implementar el inicio y la parada usted mismo, porque un sensor no puede detectar qué movimiento para comenzar si aún no ha comenzado y detectar movimiento . Por ejemplo, he usado algo como este pseudocódigo

 class MotionSensorMediator: enum state=[waiting, active] def ctor(): state = waiting def onSensorEvent(SensorEvent event): switch state: case waiting: checkMovementThreshold(event) break case active: checkMovementThreshold(event) sendToListener(event) break def checkMovementThreshold(SensorEvent event): results = //some distance calculations if result > threshold && state == waiting: state = active else if result < threshold && state == active: state = waiting
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda