通过网络找出Android设备是否处于活动状态


9

我有一个运行Android TV的nVidia Shield TV设备。

为了将其集成到我的家庭影院设置中,我需要能够确定设备是处于活动状态还是处于睡眠状态。

对于其他设备,我仅使用ping来确定。但是,由于Android设备始终处于开机状态,因此在这种情况下不起作用。

当然,一种方法是编写一个简单的应用程序,在设备处于活动状态时打开一个TCP端口,在设备处于睡眠状态时将其关闭。

我的问题是,是否有一种更简单的方法,也许是现有的应用程序或其他某种方式来执行此操作,而无需开发自己的应用程序来执行此操作。


您的Android设备是否始终连接到Wi-Fi?
frogatto

我感觉到您正在将“设备处于活动或睡眠状态”与“正在运行”混在一起。请让您提出更准确的问题。
玛丽安Paździoch

@HiImFrogatto该设备未使用WiFi,它通过以太网连接,因此始终连接到网络。
米卡·菲舍尔

@MarianPaździochAndroid TV具有称为“睡眠模式”的模式,这是一种低功耗模式,类似于手机或平板电脑的屏幕关闭时。我想区分这种睡眠模式和活动模式,即设备在电视上显示内容。这是否可以解决问题?
米卡·菲舍尔

3
@MikaFischer “ ...不用编写我自己的应用程序,...”堆栈溢出适用于那些编写代码的人:)
frogatto

Answers:


1

看来nVidia Shield Android TV配备了Android 5.1.1,并且仅从12月开始提供了棉花糖更新。我假设Android 5.1.1是您设备中安装的版本。

查询系统服务

在设备上以无线模式启用。如果需要,请遵循官方指南或Izzy的答案以获取指示。

您可以从各种系统服务的转储中找到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的状态写入文件中,例如将Sleeping设置为睡眠模式并在唤醒时将其唤醒。

塔斯克

  • 配置文件:事件→显示→显示关闭
  • 任务:(操作):文件→写入文件→选择要写入的文本文件,键入Sleeping并取消选中Add Newline
  • 配置文件:事件→显示→显示打开
  • 任务:(操作):文件→写入文件→选择要写入的文本文件,键入唤醒并取消选中添加换行符

MacroDroid

遗憾的是,Android并未附带该工具echoprintf实用程序,如果该设备已扎根,那么您可以安装busybox来安心。如果不是,请下载busybox 二进制文件,设置可执行权限,然后将其推送到/data/local/tmpadb push。对于非root用户的设备,另一种方法是保留三个文件,一个用于状态,一个包含文本“睡眠”,最后一个包含文本“唤醒”。屏幕关闭/打开时,将第二个/第三个文件复制到第一个文件中。

MacriDroid还需要一个插件(例如安全设置)来执行命令。

  • 触发:屏幕开/关→屏幕关
  • 操作:安全设置→操作→运行命令:

    • 命令: echo Sleeping > FILE_PATH
    • 命令名称:关闭屏幕
  • 触发:屏幕开/关→屏幕开
  • 操作:安全设置→操作→运行命令:

    • 命令: echo Awake > FILE_PATH
    • 命令名称:关闭屏幕

对于非root用户的Android,echo应替换为./data/local/tmp/busybox echo。否则,请使用命令进行复制操作cp SOURCE DESTINATION

自动化

您的流程或多或少应该看起来像这张图片

(点击图片放大)

IMG:

您需要创建两个流程,一个流程用于睡眠,另一个流程用于清醒。流中的第二个块名为“ 广播接收”,可以在“应用程序”下找到。第三个块名为“ 文件写入文本”,可以在“文件和存储”下找到。

您现在可以在无线模式下使用adb或使用SSH检查该文件的内容(在Android上需要SSH服务器;在所有接口上运行该服务器,而不必将其绑定到单个接口。)


还有另一种可能性,例如使自动化应用程序将文件上传到本地或远程服务器,以便您可以查询该服务器而不是Android以了解状态。



有人告诉我,这在Android TV上并非一帆风顺。让我知道我的答案是否完全无效。我把它记下来。我无意留下无用的答案。
Firelord

1
哇,谢谢你的详细回复!像这样使用Tasker就像一个魅力!唯一需要注意的是,您需要连接鼠标进行设置。我没有写文件。取而代之的是,我用Python编写了一个简单的HTTP服务器,并从Shield发送GET请求。
米卡·菲舍尔

是的,您的技术也是不错的选择。这就像告诉服务器您还活着。并感谢您的悬赏!您介意告诉我我的方法1(该系统服务方法)是否失败还是尚未尝试?
Firelord

1
我没有尝试过,因为我没有root权限,据我所知,有必要将计算机连接到启用adb网络模式的设备(例如在重启后),这对我来说太不方便了...
米卡·菲舍尔

0

这实际上不是解决方案,但是在设备设置中,可能有一个选项可以在设备进入空闲模式时禁用Wi-Fi。即使没有这样的选择,我也肯定必须有一个应用程序。因此,如果在IDLE状态下禁用了Wi-Fi,则可以使用“ ping”方法,但是当设备进入IDLE状态时,您必须处理无法正常工作的后台更新。

我认为该解决方案没有默认的应用程序,但也许进一步的帮助会对您有所帮助。您可以创建自己的Android应用程序,以监听PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED, Intent并且在收到服务器发出的某种请求后,无论设备是否处于唤醒状态,它都可以发送回。但是请注意,当您的设备收到服务器请求时,它可能会苏醒。


好主意,但是这是一个机顶盒,并通过以太网连接。正如我所写,我知道我可以编写一个应用程序。问题是是否有解决办法:)
Mika Fischer

AFAIK与开发人员的POV在Android上的连接类型没有太大差异。因此,大概有3D派对应用程序可以在设备进入空闲状态时禁用任何类型的连接,包括有线连接。

0

您可以设置Shell脚本来知道设备是否处于空闲模式。如果设备处于空闲状态,则可以
向设备发送信号。例如,您可以使用如下的adb shell命令:adb shell dumpsys deviceidle


有趣的是,我将不得不查看是否通过网络获取adb或是否可以使用SSH服务器。
米卡·菲舍尔

但是,dumpsys deviceidle至少在我的手机上并没有真正起作用(给出Can't find service: deviceidle)。
米卡·菲舍尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.