Descubra pela rede se o dispositivo Android está ativo

9

Eu tenho um dispositivo de TV nVidia Shield, que está executando o Android TV.

Para integrar isso à minha configuração de home theater, preciso determinar se o dispositivo está ativo ou em suspensão.

Para meus outros dispositivos, apenas uso o ping para determinar isso. No entanto, como os dispositivos Android estão basicamente sempre sempre ativos, isso não funciona nesse caso.

Uma maneira, é claro, seria escrever um aplicativo simples, que abra uma porta TCP quando o dispositivo estiver ativo e a feche quando estiver dormindo.

Minha pergunta é se existe uma maneira mais simples, talvez um aplicativo existente ou alguma outra maneira de fazer isso sem desenvolver meu próprio aplicativo para fazer isso.

Mika Fischer
fonte
O seu dispositivo Android está sempre conectado ao Wi-Fi?
Frogatto
Estou com a sensação de que você está misturando "o dispositivo está ativo ou dormindo" com "estar ligado". Por favor, faça sua pergunta mais precisa.
Marian Paździoch
@ HiI'mFrogatto O dispositivo não está usando WiFi, está conectado via Ethernet, portanto, está sempre conectado à rede.
Mika Fischer
@ MarianPaździoch A Android TV possui um modo chamado "modo de suspensão", que é um modo de baixo consumo de energia, semelhante a quando a tela de um telefone ou tablet está desligada. Quero distinguir entre esse modo de suspensão e o modo ativo, em que o dispositivo está exibindo coisas na TV. Isso esclarece o problema?
Mika Fischer
3
@MikaFischer "... sem escrever meu próprio aplicativo, ..." Stack Overflow é para aqueles que código:)
Frogatto

Respostas:

1

Parece que a TV nVidia Shield para Android vem com o Android 5.1.1 e uma atualização do Marshmallow está disponível apenas desde dezembro. Estou assumindo que o Android 5.1.1 é a versão instalada no seu dispositivo.

Serviços do sistema de consulta

Ative o no modo sem fio no dispositivo. Siga o guia oficial ou esta resposta de Izzy para obter instruções, se necessário.

Você pode encontrar o status do Android - em suspensão ou em vigília - no despejo de vários serviços do sistema.

  • Serviço: Poder

    adb shell dumpsys power
    

    Pesquise as strings mWakefulnesse / ou Display Power: state. Ambos dariam o status que você precisa.

    Exemplo:

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

    me dá

    mWakefulness=Asleep
    Display Power: state=OFF
    
  • Serviço: Janela

    adb shell dumpsys window
    

    Pesquise as strings mAwake=truee / ou mScreenOnEarly=truee / oumScreenOnFully=true

    Exemplo:

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

    me dá

    mAwake=true
    mScreenOnEarly=true mScreenOnFully=true
    
  • Serviço: Display

    adb shell dumpsys display
    

    Pesquise as strings mState=OFFe / ou mScreenState=OFF.

    Exemplo:

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

    me dá

    mState=OFF
    mScreenState=OFF
    

Usar automação

Se nenhum dos serviços do sistema mencionados no método anterior funcionou para você, configure um aplicativo de , como Tasker, MacroDroid ou Automate.

Agora, usaríamos a automação para gravar o status do Android em um arquivo, como Dormir no modo de suspensão e Despertar quando estiver acordado.

Tasker ,

  • Perfil: Evento → Exibir → Exibir Desativado
  • Tarefa: (Ações): Arquivo → Gravar Arquivo → selecione um arquivo de texto para gravar, digite Dormir e desmarque Adicionar Nova Linha
  • Perfil: Evento → Exibir → Exibir Ligado
  • Tarefa: (Ações): Arquivo → Gravar Arquivo → selecione um arquivo de texto para gravar, digite Desperta e desmarque Adicionar Nova Linha

MacroDroid

Infelizmente, o Android não vem com echoou printfutilitário. Se o dispositivo estiver enraizado, você poderá instalar o busybox e ficar em paz. Caso contrário, baixe o binário do busybox , defina as permissões executáveis ​​e empurre-o para /data/local/tmpuso adb push. Outra maneira de um dispositivo não-rooteado é manter três arquivos, um para state, um com o texto Sleeping e o último com o texto Awake. Sempre que a tela ligar / desligar, copie o segundo / terceiro arquivo para o primeiro.

O MacriDroid também requer um plug-in, como Configurações seguras, para executar comandos.

  • Trigger: Tela ativada / desativada → Tela desativada
  • Ação: Configurações seguras → Ações → Executar comando:

    • Comando: echo Sleeping > FILE_PATH
    • Nome do comando: Tela desativada
  • Trigger: Tela ativada / desativada → Tela ativada
  • Ação: Configurações seguras → Ações → Executar comando:

    • Comando: echo Awake > FILE_PATH
    • Nome do comando: Tela desativada

Para um Android sem raiz, echodeve ser substituído por ./data/local/tmp/busybox echo. Caso contrário, faça uma operação de cópia usando o comando cp SOURCE DESTINATION.

Automatizar

Seu fluxo deve parecer mais ou menos com esta imagem

(Clique na imagem para ampliar)

IMG:

Você precisa criar dois fluxos, um para dormir e outro para acordar. O segundo bloco no fluxo é chamado de recebimento de transmissão e pode ser encontrado em Aplicativos. O terceiro bloco é denominado Arquivo de gravação de texto e pode ser encontrado em Arquivo e armazenamento.

Agora você pode verificar o conteúdo desse arquivo usando adb no modo sem fio ou usando SSH (requer um servidor SSH no Android; execute o servidor em todas as interfaces e não o vincule a uma única interface.)


Há outra possibilidade, como fazer com que o aplicativo de automação carregue o arquivo em um servidor local ou remoto para que você possa consultar o servidor em vez do Android para saber o status.


Senhor do Fogo
fonte
Algo me diz que isso não será uma tarefa fácil na Android TV. Deixe-me saber se minha resposta não funciona. Eu vou derrubar. Não pretendo manter uma resposta inútil à espreita.
Firelord
11
Uau, obrigado pela resposta detalhada! Usar Tasker assim funcionou como um encanto! A única ressalva é que você precisa conectar um mouse para configurá-lo. Não escrevi em um arquivo. Em vez disso, escrevi um servidor HTTP simples em Python e enviei solicitações GET a partir do escudo.
Mika Fischer
Sim, a sua também é uma boa técnica. É como dizer ao servidor que você está vivo. E obrigado pela recompensa! Você se importaria de me dizer se meu método 1 (esse método de serviço do sistema) falhou ou você ainda não experimentou?
Firelord
11
Eu não tentei porque não estou enraizado e, tanto quanto posso ver, é necessário conectar um computador ao dispositivo para ativar o modo de rede adb (após reinicializações, por exemplo), o que é muito inconveniente para mim ...
Mika Fischer
0

Na verdade, essa não é uma solução, mas nas configurações do dispositivo provavelmente existe uma opção que desativa o Wi-Fi quando o dispositivo entra no modo ocioso. Mesmo se não houver essa opção, tenho certeza de que deve haver um aplicativo para isso. Portanto, se o Wi-Fi estiver desativado no estado IDLE, a abordagem "ping" funcionará, mas você precisará lidar com atualizações em segundo plano que não funcionam e assim por diante quando o dispositivo entrar no estado IDLE.

Não acho que exista um aplicativo padrão para esta solução, mas talvez outro ponto o ajude. Você pode criar seu próprio aplicativo Android que ouve o PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED Intent e, ao receber algum tipo de solicitação do servidor, pode enviar de volta se o dispositivo estiver ativado ou não. No entanto, observe que, quando o dispositivo recebe uma solicitação do servidor, ele provavelmente fica ativado.


fonte
Boa ideia, no entanto, este é um decodificador e conectado via Ethernet. E, como escrevi, sei que posso escrever um aplicativo. A questão é se há uma maneira de contornar a fazer isso :)
Mika Fischer
AFAIK não há grande diferença nos tipos de conexão no Android a partir do ponto de vista do desenvolvedor. Portanto, provavelmente existe um aplicativo de festa em 3D que pode desativar qualquer tipo de conexão, incluindo com fio quando o dispositivo entra no estado ocioso.
0

Você pode configurar um script de shell para saber se o dispositivo está no modo ocioso .. se o dispositivo estiver ocioso .. então você pode
enviar um sinal para o dispositivo. Por exemplo, você pode usar o comando adb shell como abaixo: adb shell dumpsys deviceidle


fonte
Interessante, vou ter que ver se consigo adb trabalhando na rede ou se um servidor SSH pode ser usado.
Mika Fischer
No entanto, dumpsys deviceidlerealmente não funciona no meu telefone, pelo menos (dá Can't find service: deviceidle).
Mika Fischer