Averigüe en la red si el dispositivo Android está activo

9

Tengo un dispositivo nVidia Shield TV, que ejecuta Android TV.

Para integrar esto en mi configuración de cine en casa, necesito poder determinar si el dispositivo está activo o inactivo.

Para mis otros dispositivos, solo uso ping para determinar esto. Sin embargo, dado que los dispositivos Android están básicamente siempre encendidos, esto no funciona en este caso.

Una forma, por supuesto, sería escribir una aplicación simple, que abre un puerto TCP cuando el dispositivo está activo y lo cierra cuando está inactivo.

Mi pregunta es si hay una manera más simple, tal vez una aplicación existente o alguna otra forma de hacerlo sin desarrollar mi propia aplicación para hacerlo.

Mika Fischer
fuente
¿Su dispositivo Android está siempre conectado a la red Wi-Fi?
frogatto
Tengo la sensación de que estás mezclando "el dispositivo está activo o durmiendo" con "estar encendido". Haz que tu pregunta sea más precisa.
Marian Paździoch
@ HiI'mFrogatto El dispositivo no usa WiFi, está conectado a través de Ethernet, por lo que siempre está conectado a la red.
Mika Fischer
@ MarianPaździoch Android TV tiene un modo llamado "modo de suspensión", que es un modo de bajo consumo de energía, similar a cuando la pantalla de un teléfono o tableta está apagada. Quiero distinguir entre este modo de suspensión y el modo activo, donde el dispositivo muestra cosas en el televisor. ¿Eso aclara el problema?
Mika Fischer
3
@MikaFischer "... sin escribir mi propia aplicación, ..." Stack Overflow es para quienes codifican:)
frogatto

Respuestas:

1

Parece que nVidia Shield Android TV viene con Android 5.1.1 y una actualización de Marshmallow está disponible solo desde diciembre. Supongo que Android 5.1.1 es la versión instalada en su dispositivo.

Consultar servicios del sistema

Habilite en modo inalámbrico en el dispositivo. Siga la guía oficial o esta respuesta de Izzy para obtener instrucciones, si es necesario.

Puede encontrar el estado de Android, en reposo o despierto, desde el volcado de varios servicios del sistema.

  • Servicio: poder

    adb shell dumpsys power
    

    Buscar las cadenas mWakefulnessy / o Display Power: state. Ambos te darían el estado que necesitas.

    Ejemplo:

    adb shell 'dumpsys power | grep -e "mWakefulness=" -e "Display Power"'
    

    me da

    mWakefulness=Asleep
    Display Power: state=OFF
    
  • Servicio: ventana

    adb shell dumpsys window
    

    Buscar las cadenas mAwake=truey / o mScreenOnEarly=truey / omScreenOnFully=true

    Ejemplo:

    adb shell 'dumpsys window | grep -e "mAwake=" -e "mScreenOnEarly" -e "mScreenOnFully"'
    

    me da

    mAwake=true
    mScreenOnEarly=true mScreenOnFully=true
    
  • Servicio: pantalla

    adb shell dumpsys display
    

    Buscar las cadenas mState=OFFy / o mScreenState=OFF.

    Ejemplo:

    adb shell 'dumpsys display | grep -e "mState=" -e "mScreenState"'
    

    me da

    mState=OFF
    mScreenState=OFF
    

Usar automatización

Si ninguno de los servicios del sistema mencionados en el método anterior funcionó para usted, configure una aplicación de , como Tasker o MacroDroid o Automate.

Ahora usaríamos la automatización para escribir el estado de Android en un archivo, como Dormir para el modo de suspensión y Despertar cuando está despierto.

Tasker ,

  • Perfil: Evento → Pantalla → Pantalla desactivada
  • Tarea: (Acciones): Archivo → Escribir archivo → seleccione un archivo de texto para escribir, escriba Dormir y desmarque Agregar nueva línea
  • Perfil: Evento → Pantalla → Pantalla activada
  • Tarea: (Acciones): Archivo → Escribir archivo → seleccione un archivo de texto para escribir, escriba Despertar y desmarque Agregar nueva línea

MacroDroid

Android lamentablemente no viene con echoo printfutilidad, si el dispositivo tiene sus raíces entonces se puede instalar busybox y estar en paz. De lo contrario, descargue binario busybox , establezca permisos ejecutables y póngalo en /data/local/tmpuso adb push. Otra forma para un dispositivo no rooteado es mantener tres archivos, uno para el estado, uno con el texto Durmiendo y el último con el texto Despertar. Siempre que la pantalla se apague / encienda, copie el segundo / tercer archivo en el primero.

MacriDroid también requiere un complemento, como Configuración segura para ejecutar comandos.

  • Activador: Pantalla encendida / apagada → Pantalla apagada
  • Acción: Configuración segura → Acciones → Ejecutar comando:

    • Mando: echo Sleeping > FILE_PATH
    • Nombre del comando: pantalla apagada
  • Activador: pantalla encendida / apagada → pantalla encendida
  • Acción: Configuración segura → Acciones → Ejecutar comando:

    • Mando: echo Awake > FILE_PATH
    • Nombre del comando: pantalla apagada

Para un Android no rooteado, echodebe reemplazarse con ./data/local/tmp/busybox echo. De lo contrario, realice una operación de copia con el comando cp SOURCE DESTINATION.

Automatizar

Tu flujo debería verse más o menos como esta imagen

(Haga clic en la imagen para ampliarla)

IMG:

Su necesidad de crear dos flujos, uno para dormir y otro para estar despierto. El segundo bloque en el flujo se denomina recepción de difusión y se puede encontrar en Aplicaciones. El tercer bloque se llama Texto de escritura de archivo y se puede encontrar en Archivo y almacenamiento.

Ahora puede verificar el contenido de ese archivo usando adb en modo inalámbrico o SSH (requiere un servidor SSH en Android; ejecute el servidor en todas las interfaces y no lo vincule a una sola interfaz).


Existe otra posibilidad, como hacer que su aplicación de automatización cargue el archivo en un servidor local o remoto para que pueda consultar ese servidor en lugar de Android para conocer el estado.


Señor del fuego
fuente
Algo me dice que esto no será fácil en Android TV. Avíseme si mi respuesta no funciona en absoluto. Lo derribaré. No tengo la intención de mantener una respuesta inútil acechando.
Señor del fuego
1
¡Guau, gracias por la respuesta detallada! ¡Usar Tasker de esta manera funcionó de maravilla! La única advertencia es que necesita conectar un mouse para configurarlo. No escribí en un archivo. En cambio, escribí un servidor HTTP simple en Python y le envié solicitudes GET desde el escudo.
Mika Fischer
Sí, la tuya también es una buena técnica. Es como decirle al servidor que estás vivo. Y gracias por la recompensa! ¿Te importaría decirme si mi método 1 (ese método de servicio del sistema) falló o aún no lo has probado?
Señor del fuego
1
No lo intenté porque no estoy rooteado y, por lo que puedo ver, es necesario conectar una computadora al dispositivo para habilitar el modo de red adb (después de reiniciar, por ejemplo), lo cual es demasiado inconveniente para mí ...
Mika Fischer
0

En realidad, esta no es una solución, pero en la configuración del dispositivo probablemente haya una opción que deshabilite el Wi-Fi cuando el dispositivo pasa al modo inactivo. Incluso si no existe tal opción, estoy seguro de que debe haber una aplicación para esto. Entonces, si el Wi-Fi está deshabilitado en estado IDLE, entonces el enfoque de "ping" funcionará, pero debe lidiar con actualizaciones de fondo que no funcionan y así sucesivamente cuando el dispositivo pasa al estado IDLE.

No creo que haya una aplicación predeterminada para esta solución, pero quizás algún punto adicional lo ayude. Puede crear su propia aplicación de Android que escuche a PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED Intent y al recibir algún tipo de solicitud de su servidor, puede enviarla de regreso si el dispositivo está despierto o no. Sin embargo, tenga en cuenta que cuando su dispositivo recibe la solicitud del servidor, probablemente se despierte.


fuente
Buena idea, sin embargo, este es un decodificador y está conectado a través de Ethernet. Y mientras escribía, sé que puedo escribir una aplicación. La pregunta es si hay alguna forma de hacerlo :)
Mika Fischer
AFAIK no hay una gran diferencia en los tipos de conexión en Android desde el punto de vista del desarrollador. Por lo tanto, es probable que haya una aplicación de fiesta en 3D que puede deshabilitar cualquier tipo de conexión, incluso por cable, cuando el dispositivo entra en estado inactivo.
0

Puede configurar un script de shell para saber si el dispositivo está en modo inactivo ... si el dispositivo está inactivo ... luego puede
enviar señal al dispositivo ... Por ejemplo, puede usar el comando adb shell como se muestra a continuación: adb shell dumpsys deviceidle


fuente
Interesante, tendré que ver si puedo hacer que adb funcione a través de la red o si se puede usar un servidor SSH en su lugar.
Mika Fischer
Sin embargo, dumpsys deviceidleno funciona realmente en mi teléfono al menos (da Can't find service: deviceidle).
Mika Fischer