Узнайте по сети, если устройство Android активно

9

У меня есть устройство nVidia Shield TV, которое работает под управлением Android TV.

Чтобы интегрировать это в настройку домашнего кинотеатра, мне необходимо определить, активно ли устройство или находится в спящем режиме.

Для других моих устройств я просто использую ping, чтобы определить это. Однако, поскольку устройства Android в основном всегда включены, в этом случае это не работает.

Конечно, можно написать простое приложение, которое открывает порт TCP, когда устройство активно, и закрывает его, когда оно спит.

У меня вопрос: есть ли более простой способ, может быть, существующее приложение или какой-либо другой способ сделать это без разработки собственного приложения для этого.

Мика Фишер
источник
Ваше устройство Android всегда подключено к Wi-Fi?
frogatto
У меня такое ощущение, что вы смешиваете «устройство активно или спит» с «включенным». Пожалуйста, сделайте ваш вопрос более точным.
Мариан Паджиох
@ HiI'mFrogatto Устройство не использует WiFi, оно подключено через Ethernet, поэтому оно всегда подключено к сети.
Мика Фишер
@ MarianPaździoch Android TV имеет режим, называемый «спящий режим», который представляет собой режим пониженного энергопотребления, аналогичный тому, когда экран телефона или планшета выключен. Я хочу провести различие между этим спящим режимом и активным режимом, когда устройство отображает информацию на телевизоре. Это проясняет проблему?
Мика Фишер
3
@MikaFischer "... без написания собственного приложения, ..." Переполнение стека для тех, кто :)
пишет

Ответы:

1

Похоже, что nVidia Shield Android TV поставляется с Android 5.1.1, а обновление Marshmallow доступно только с декабря. Я предполагаю, что Android 5.1.1 - это версия, установленная на вашем устройстве.

Запрос системных служб

Включить в беспроводном режиме на устройстве. При необходимости следуйте официальному руководству или этому ответу Иззи для получения инструкций.

Вы можете узнать состояние Android - спящий или бодрствующий - из свалки различных системных сервисов.

  • Сервис: мощность

    adb shell dumpsys power
    

    Поиск строк mWakefulnessи / или Display Power: state. Они оба дадут вам статус, который вам нужен.

    Пример:

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

    дает мне

    mWakefulness=Asleep
    Display Power: state=OFF
    
  • Сервис: Окно

    adb shell dumpsys window
    

    Поиск строк mAwake=trueи / или mScreenOnEarly=trueи / илиmScreenOnFully=true

    Пример:

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

    дает мне

    mAwake=true
    mScreenOnEarly=true mScreenOnFully=true
    
  • Сервис: Дисплей

    adb shell dumpsys display
    

    Поиск строк mState=OFFи / или mScreenState=OFF.

    Пример:

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

    дает мне

    mState=OFF
    mScreenState=OFF
    

Использовать автоматизацию

Если ни одна из системных служб, упомянутых в предыдущем методе, не работает для вас, настройте приложение для , такое как Tasker, MacroDroid или Automate.

Теперь мы будем использовать автоматизацию для записи состояния Android в файл, например, «Спящий режим» и «Пробуждение», когда он активен.

Tasker ,

  • Профиль: Событие → Дисплей → Дисплей выключен
  • Задача: (Действия): Файл → Запись файла → выберите текстовый файл для записи, введите Sleeping и снимите флажок Добавить новую строку
  • Профиль: Событие → Дисплей → Дисплей вкл
  • Задача: (Действия): Файл → Запись файла → выберите текстовый файл для записи, введите Awake и снимите флажок Добавить новую строку

MacroDroid

Android , к сожалению , не входит echoили printfутилита, если устройство укоренено , то вы можете установить BusyBox и быть в мире. Если нет, загрузите двоичный файл busybox , установите права доступа к исполняемому файлу и вставьте его в /data/local/tmpиспользование adb push. Другой способ для нерутированного устройства - сохранить три файла, один для состояния, один с текстом Sleeping и последний с текстом Awake. Всякий раз, когда экран выключается / включается, скопируйте второй / третий файл в первый.

MacriDroid также требует плагин, такой как Secure Settings для выполнения команд.

  • Триггер: включение / выключение экрана → выключение экрана
  • Действие: Безопасные настройки → Действия → Команда запуска:

    • Команда: echo Sleeping > FILE_PATH
    • Название команды: Экран выключен
  • Триггер: включение / выключение экрана → включение экрана
  • Действие: Безопасные настройки → Действия → Команда запуска:

    • Команда: echo Awake > FILE_PATH
    • Название команды: Экран выключен

Для нерутированного Android echoследует заменить на ./data/local/tmp/busybox echo. В противном случае выполните операцию копирования с помощью команды cp SOURCE DESTINATION.

Автоматизировать

Ваш поток должен более или менее выглядеть как это изображение

(Нажмите на изображение, чтобы увеличить)

IMG:

Вам нужно создать два потока, один для сна и другой для бодрствования. Второй блок в потоке называется Broadcast receive и находится в разделе Apps. Третий блок называется File write text и находится в разделе «Файл и хранилище».

Теперь вы можете проверить содержимое этого файла, используя adb в беспроводном режиме или используя SSH (требуется сервер SSH на Android; запустите сервер на всех интерфейсах и не привязывайте его к одному интерфейсу.)


Существует еще одна возможность, например, заставить ваше приложение автоматизации загружать файл на локальный или удаленный сервер, чтобы вы могли запросить этот сервер вместо Android, чтобы узнать состояние.


Повелитель огня
источник
Что-то подсказывает мне, что это не будет гладко на Android TV. Дайте мне знать, если мой ответ не работает вообще. Я сниму это. Я не собираюсь скрывать бесполезный ответ.
Повелитель огня
1
Вау, спасибо за подробный ответ! Использование Tasker, как это работает как шарм! Единственное предостережение в том, что вам нужно подключить мышь, чтобы настроить его. Я не писал в файл. Вместо этого я написал простой HTTP-сервер на Python и отправляю на него запросы GET со щита.
Мика Фишер
Да, у тебя тоже хорошая техника. Это как сказать серверу, что ты жив. И спасибо за щедрость! Не могли бы вы сказать мне, был ли сбой моего метода 1 (этот метод системного обслуживания) или вы еще не пробовали его?
Повелитель огня
1
Я не пробовал, потому что у меня нет рута, и, насколько я вижу, необходимо подключить компьютер к устройству, чтобы включить сетевой режим ADB (например, после перезагрузок), что для меня слишком неудобно ...
Мика Фишер
0

На самом деле это не решение, но в настройках устройства, вероятно, есть опция, которая отключает Wi-Fi, когда устройство переходит в режим ожидания. Даже если такой опции нет, я уверен, что для этого должна быть заявка. Таким образом, если Wi-Fi отключен в состоянии IDLE, тогда будет работать подход «ping», но вам придется иметь дело с неработающими фоновыми обновлениями и т. Д., Когда устройство переходит в состояние IDLE.

Я не думаю, что для этого решения есть приложение по умолчанию, но, возможно, вам поможет следующий момент. Вы можете создать свое собственное приложение для Android, которое прослушивает PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED, Intent и после получения какого-либо запроса от вашего сервера оно может отправить его обратно, если устройство не спит или нет. Однако обратите внимание, что когда ваше устройство получает запрос от сервера, оно, вероятно, проснется.


источник
Хорошая идея, однако это приставка и подключена через Ethernet. И как я уже писал, я знаю, что могу написать приложение. Вопрос в том, есть ли способ сделать это :)
Мика Фишер
AFAIK нет большой разницы в типах подключения на Android от POV разработчика. Так что, вероятно, существует приложение стороннего разработчика, которое может отключить любой тип подключения, включая проводное, когда устройство переходит в состояние ожидания.
0

Вы можете настроить сценарий оболочки, чтобы узнать, находится ли устройство в режиме ожидания. Если устройство находится в режиме ожидания. Затем вы можете
отправить сигнал на устройство. Например, вы можете использовать команду оболочки adb, как показано ниже: adb shell dumpsys deviceidle


источник
Интересно, мне нужно посмотреть, смогу ли я получить ADB, работающий по сети, или вместо этого можно использовать сервер SSH.
Мика Фишер
Однако, dumpsys deviceidleпо крайней мере , не работает на моем телефоне по крайней мере (дает Can't find service: deviceidle).
Мика Фишер