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.


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.



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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.