Finden Sie über das Netzwerk heraus, ob das Android-Gerät aktiv ist

9

Ich habe ein nVidia Shield TV-Gerät, auf dem Android TV ausgeführt wird.

Um dies in mein Heimkino-Setup zu integrieren, muss ich feststellen können, ob das Gerät aktiv ist oder schläft.

Für meine anderen Geräte verwende ich nur Ping, um dies zu bestimmen. Da Android-Geräte grundsätzlich immer eingeschaltet sind, funktioniert dies in diesem Fall nicht.

Eine Möglichkeit wäre natürlich, eine einfache App zu schreiben, die einen TCP-Port öffnet, wenn das Gerät aktiv ist, und ihn schließt, wenn es sich im Ruhezustand befindet.

Meine Frage ist, ob es einen einfacheren Weg gibt, vielleicht eine vorhandene App oder einen anderen Weg, dies zu tun, ohne meine eigene App dafür zu entwickeln.

Mika Fischer
quelle
Ist Ihr Android-Gerät immer mit dem WLAN verbunden?
Frogatto
Ich habe das Gefühl, dass Sie "Gerät ist aktiv oder schläft" mit "eingeschaltet" mischen. Bitte machen Sie Ihre Frage genauer.
Marian Paździoch
@ HiI'mFrogatto Das Gerät verwendet kein WLAN, es ist über Ethernet verbunden, daher ist es immer mit dem Netzwerk verbunden.
Mika Fischer
@ MarianPaździoch Android TV verfügt über einen Modus namens "Schlafmodus", bei dem es sich um einen Energiesparmodus handelt, ähnlich wie bei ausgeschaltetem Bildschirm eines Telefons oder Tablets. Ich möchte zwischen diesem Schlafmodus und dem aktiven Modus unterscheiden, in dem das Gerät Inhalte auf dem Fernseher anzeigt. Klärt das das Problem?
Mika Fischer
3
@MikaFischer "... ohne meine eigene App zu schreiben, ..." Stack Overflow ist für diejenigen, die Code:)
Frogatto

Antworten:

1

Es scheint, dass nVidia Shield Android TV mit Android 5.1.1 geliefert wird und ein Marshmallow-Update erst seit Dezember verfügbar ist. Ich gehe davon aus, dass Android 5.1.1 die auf Ihrem Gerät installierte Version ist.

Systemdienste abfragen

Aktivieren Sie im Wireless-Modus auf dem Gerät. Folgen Sie bei Bedarf dem offiziellen Leitfaden oder dieser Antwort von Izzy, um Anweisungen zu erhalten.

Sie können den Status von Android - Schlaf oder Wach - aus dem Speicherauszug verschiedener Systemdienste ermitteln.

  • Service: Leistung

    adb shell dumpsys power
    

    Suchen Sie die Zeichenfolgen mWakefulnessund / oder Display Power: state. Beide würden Ihnen den Status geben, den Sie benötigen.

    Beispiel:

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

    gibt mir

    mWakefulness=Asleep
    Display Power: state=OFF
    
  • Service: Fenster

    adb shell dumpsys window
    

    Suchen Sie die Zeichenfolgen mAwake=trueund / oder mScreenOnEarly=trueund / odermScreenOnFully=true

    Beispiel:

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

    gibt mir

    mAwake=true
    mScreenOnEarly=true mScreenOnFully=true
    
  • Service: Anzeige

    adb shell dumpsys display
    

    Suchen Sie die Zeichenfolgen mState=OFFund / oder mScreenState=OFF.

    Beispiel:

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

    gibt mir

    mState=OFF
    mScreenState=OFF
    

Verwenden Sie die Automatisierung

Wenn keiner der in der vorherigen Methode genannten Systemdienste für Sie funktioniert hat, richten Sie eine App ein, z. B. Tasker, MacroDroid oder Automate.

Wir würden jetzt die Automatisierung verwenden, um den Status von Android in eine Datei zu schreiben, z. B. Sleeping for Sleep-Modus und Awake, wenn es wach ist.

Tasker ,

  • Profil: Ereignis → Anzeige → Anzeige aus
  • Aufgabe: (Aktionen): Datei → Datei schreiben → Wählen Sie eine Textdatei aus, in die geschrieben werden soll, geben Sie Sleeping ein und deaktivieren Sie Add Newline
  • Profil: Ereignis → Anzeige → Anzeige ein
  • Aufgabe: (Aktionen): Datei → Datei schreiben → Wählen Sie eine Textdatei aus, in die geschrieben werden soll, geben Sie Awake ein und deaktivieren Sie Add Newline

MacroDroid

Android kommt leider nicht mit echooder printfDienstprogramm. Wenn das Gerät gerootet ist, können Sie Busybox installieren und in Ruhe sein. Wenn nicht, laden Sie die Busybox- Binärdatei herunter , legen Sie die ausführbaren Berechtigungen fest und verwenden Sie /data/local/tmpsie adb push. Eine andere Möglichkeit für ein nicht gerootetes Gerät besteht darin, drei Dateien zu speichern, eine für den Status, eine mit dem Text Sleeping und die letzte mit dem Text Awake. Wenn der Bildschirm ein- oder ausgeschaltet wird, kopieren Sie die zweite / dritte Datei in die erste.

Für MacriDroid ist außerdem ein Plugin erforderlich, z. B. Sichere Einstellungen , um Befehle auszuführen.

  • Auslöser: Bildschirm ein / aus → Bildschirm aus
  • Aktion: Sichere Einstellungen → Aktionen → Befehl ausführen:

    • Befehl: echo Sleeping > FILE_PATH
    • Befehlsname: Bildschirm aus
  • Auslöser: Bildschirm ein / aus → Bildschirm ein
  • Aktion: Sichere Einstellungen → Aktionen → Befehl ausführen:

    • Befehl: echo Awake > FILE_PATH
    • Befehlsname: Bildschirm aus

Für ein nicht gerootetes Android echosollte durch ersetzt werden ./data/local/tmp/busybox echo. Führen Sie andernfalls einen Kopiervorgang mit dem Befehl aus cp SOURCE DESTINATION.

Automatisieren

Ihr Flow sollte mehr oder weniger wie dieses Bild aussehen

(Klicken Sie auf das Bild, um es zu vergrößern)

IMG:

Sie müssen zwei Flüsse erstellen, einen für den Schlaf und einen für den Wachzustand. Der zweite Block im Flow heißt Broadcast Receive und befindet sich unter Apps. Der dritte Block heißt File Write Text und befindet sich unter File & Storage.

Sie können den Inhalt dieser Datei jetzt mit adb im Wireless-Modus oder mit SSH überprüfen (erfordert einen SSH-Server unter Android; führen Sie den Server auf allen Schnittstellen aus und binden Sie ihn nicht an eine einzige Schnittstelle.)


Es gibt eine andere Möglichkeit, z. B. Ihre Automatisierungs-App dazu zu bringen, die Datei auf einen lokalen oder Remote-Server hochzuladen, damit Sie diesen Server anstelle von Android abfragen können, um den Status zu ermitteln.


Feuerlord
quelle
Etwas sagt mir, dass dies auf Android TV keine reibungslose Fahrt sein wird. Lassen Sie mich wissen, wenn meine Antwort überhaupt nicht funktioniert. Ich werde es abnehmen. Ich habe nicht vor, eine nicht hilfreiche Antwort zu behalten.
Feuerlord
1
Wow, danke für die ausführliche Antwort! Die Verwendung von Tasker wie diesem hat wie ein Zauber funktioniert! Die einzige Einschränkung ist, dass Sie eine Maus anschließen müssen, um sie einzurichten. Ich habe nicht in eine Datei geschrieben. Stattdessen habe ich einen einfachen HTTP-Server in Python geschrieben und GET-Anfragen vom Shield an ihn gesendet.
Mika Fischer
Ja, deine ist auch eine schöne Technik. Es ist, als würde man dem Server sagen, dass man lebt. Und danke für das Kopfgeld! Würde es Ihnen etwas ausmachen, mir zu sagen, ob meine Methode 1 (diese Systemdienstmethode) fehlgeschlagen ist oder ob Sie sie noch nicht ausprobiert haben?
Feuerlord
1
Ich habe es nicht ausprobiert, weil ich nicht verwurzelt bin. Soweit ich sehen kann, muss ein Computer an das Gerät angeschlossen werden, um den ADB-Netzwerkmodus zu aktivieren (z. B. nach einem Neustart), was für mich zu unpraktisch ist.
Mika Fischer
0

Dies ist eigentlich keine Lösung, aber in den Geräteeinstellungen gibt es wahrscheinlich eine Option, die Wi-Fi deaktiviert, wenn das Gerät in den Leerlaufmodus wechselt. Auch wenn es keine solche Option gibt, muss es sicher eine Anwendung dafür geben. Wenn Wi-Fi im IDLE-Status deaktiviert ist, funktioniert der "Ping" -Ansatz, Sie müssen sich jedoch mit nicht funktionierenden Hintergrundaktualisierungen usw. befassen, wenn das Gerät in den IDLE-Status wechselt.

Ich glaube nicht, dass es eine Standardanwendung für diese Lösung gibt, aber vielleicht hilft Ihnen ein weiterer Punkt. Sie können Ihre eigene Android-Anwendung erstellen, die PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED abhört. Wenn SieIntent eine Anfrage von Ihrem Server erhalten, können Sie diese zurücksenden , wenn das Gerät wach ist oder nicht. Beachten Sie jedoch, dass Ihr Gerät, wenn es eine Serveranforderung empfängt, wahrscheinlich wach wird.


quelle
Gute Idee, dies ist jedoch eine Set-Top-Box, die über Ethernet verbunden ist. Und während ich schrieb, weiß ich, dass ich eine App schreiben kann. Die Frage ist, ob es einen Weg gibt, das zu tun :)
Mika Fischer
AFAIK Es gibt keinen großen Unterschied zwischen den Verbindungstypen unter Android und dem POV von dev. Es gibt also wahrscheinlich eine 3D-Party-App, die jede Art von Verbindung deaktivieren kann, einschließlich Kabel, wenn das Gerät in den Ruhezustand wechselt.
0

Sie können ein Shell-Skript einrichten, um festzustellen, ob sich das Gerät im Leerlaufmodus befindet. Wenn sich das Gerät im Leerlauf befindet. Dann können
Sie ein Signal an das Gerät senden. Beispielsweise können Sie den folgenden Befehl adb shell verwenden: adb shell dumpsys deviceidle


quelle
Interessant, ich muss sehen, ob ich adb über das Netzwerk zum Laufen bringen kann oder ob stattdessen ein SSH-Server verwendet werden kann.
Mika Fischer
Funktioniert jedoch dumpsys deviceidlezumindest auf meinem Handy nicht wirklich (gibt Can't find service: deviceidle).
Mika Fischer