Androidデバイスがアクティブかどうかをネットワーク経由で確認する


9

Android TVを実行しているnVidia Shield TVデバイスを持っています。

これをホームシアターのセットアップに統合するには、デバイスがアクティブかスリープ状態かを判断できる必要があります。

他のデバイスでは、pingを使用してこれを特定します。ただし、Androidデバイスは基本的に常にオンになっているため、この場合は機能しません。

もちろん、1つの方法は、デバイスがアクティブなときにTCPポートを開き、スリープしているときにポートを閉じる単純なアプリを作成することです。

私の質問は、これを行うための独自のアプリを開発せずに、もっと簡単な方法、おそらく既存のアプリまたはこれを行う他の方法があるかどうかです。


Androidデバイスは常にWi-Fiに接続されていますか?
frogatto

「デバイスがアクティブまたはスリープ」と「オン」を混ぜ合わせているような感じがします。より正確に質問してください。
MarianPaździoch15年

@ HiI'mFrogattoデバイスはWiFiを使用しておらず、イーサネット経由で接続されているため、常にネットワークに接続されています。
ミカフィッシャー

@MarianPaździochAndroid TVには、「スリープモード」と呼ばれるモードがあります。これは、携帯電話またはタブレットの画面がオフになっているときと同様に、低電力モードです。このスリープモードと、デバイスがTVにコンテンツを表示しているアクティブモードを区別したいと思います。それで問題は明確になりましたか?
ミカフィッシャー

3
@MikaFischer 「...自分のアプリを書かずに...」スタックオーバーフローは、コードを:)
書く

回答:


1

nVidia Shield Android TVにはAndroid 5.1.1が付属しており、Marshmallowのアップデートは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=trueand / orを検索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、スリープ状態の場合はAwakeなど)。

タスカー

  • プロファイル:イベント→表示→表示オフ
  • タスク:(アクション):ファイル→ファイルの書き込み→書き込むテキストファイルを選択し、「スリープ」と入力して、「改行の追加」のチェックを外します
  • プロファイル:イベント→表示→表示オン
  • タスク:(アクション):ファイル→ファイルの書き込み→書き込むテキストファイルを選択し、Awakeと入力して、[改行の追加]チェックボックスをオフにします。

MacroDroid

Androidの悲しげに付属していないechoか、printfデバイスが根ざしている場合、あなたがインストールすることができ、ユーティリティbusyboxのを、平和であること。そうでない場合は、busybox バイナリをダウンロードし、実行権限を設定して、を/data/local/tmp使用するようにプッシュしadb pushます。ルート権限を取得されていないデバイスのもう1つの方法は、3つのファイルを保持することです。1つは状態用、1つはテキスト「睡眠」、最後のファイルは「目覚め」です。画面がオフ/オンになるたびに、2番目または3番目のファイルを最初のファイルにコピーします。

MacriDroidには、コマンドを実行するためのSecure Settingsなどのプラグインも必要です。

  • トリガー:画面オン/オフ→画面オフ
  • アクション:安全な設定→アクション→コマンドの実行:

    • コマンド: echo Sleeping > FILE_PATH
    • コマンド名:画面オフ
  • トリガー:画面オン/オフ→画面オン
  • アクション:安全な設定→アクション→コマンドの実行:

    • コマンド: echo Awake > FILE_PATH
    • コマンド名:画面オフ

ルート権限を取得していないAndroidの場合echoは、に置き換える必要があり./data/local/tmp/busybox echoます。それ以外の場合は、コマンドを使用してコピー操作を実行しますcp SOURCE DESTINATION

自動化

あなたの流れは多かれ少なかれこの画像のように見えるはずです

(画像をクリックすると拡大します)

IMG:

睡眠用と目覚め用の2つのフローを作成する必要があります。フローの2番目のブロックはBroadcast receiveという名前で、Appsの下にあります。3番目のブロックはFile write textという名前で、File&Storageの下にあります。

これで、ワイヤレスモードでadbを使用するか、SSHを使用して、そのファイルの内容を確認できます(AndroidでSSHサーバーが必要です。サーバーはすべてのインターフェースで実行し、単一のインターフェースにバインドしないでください)。


ステータスを知るために、Androidではなくそのサーバーにクエリを実行できるように、自動化アプリでファイルをローカルサーバーまたはリモートサーバーにアップロードするなど、別の可能性もあります。



これは、Android TVでのスムーズな移動にはなりません。私の答えがまったく機能しない場合はお知らせください。落とします。役に立たない答えが潜んでいるつもりはありません。
ファイヤーロード

1
ワウ、きめ細かな対応ありがとうございます!このようなタスカーを使うのは魅力的でした!唯一の注意点は、設定するためにマウスを接続する必要があることです。ファイルに書きませんでした。代わりに、Pythonで単純なHTTPサーバーを作成し、シールドからGETリクエストを送信します。
ミカフィッシャー

ええ、あなたもあなたの素晴らしいテクニックです。これは、サーバーが生きていることを伝えるようなものです。そして、賞金をありがとう!私の方法1(そのシステムサービス方法)が失敗したのか、それともまだ試していないのか教えていただけませんか?
ファイアロード

1
ルート権限を取得していないため、試してみませんでした。見る限り、コンピュータをデバイスに接続してadbネットワークモードを有効にする必要があります(再起動後など)。これは、私には不便です...
ミカフィッシャー

0

これは実際には解決策ではありませんが、デバイスの設定で、デバイスがアイドルモードになったときにWi-Fiを無効にするオプションがおそらくあるでしょう。そのような選択肢がないとしても、これのためのアプリケーションがあるに違いない。したがって、アイドル状態でWi-Fiが無効になっている場合、「ping」アプローチは機能しますが、デバイスがアイドル状態になったときに、機能していないバックグラウンド更新などに対処する必要があります。

このソリューションにはデフォルトのアプリケーションがあるとは思いませんが、さらにポイントが役立つかもしれません。PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED をリッスンする独自のAndroidアプリケーションを作成できますIntent。サーバーから何らかの要求を受信すると、デバイスが起動しているかどうかに関係なく送信できます。ただし、デバイスがサーバー要求を受信すると、おそらく起動します。


良い考えですが、これはセットトップボックスであり、イーサネット経由で接続されます。そして私が書いたように、私はアプリを書くことができることを知っています。問題はそれを回避する方法があるかどうかです:)
Mika Fischer

私の知る限り、Androidでの接続の種類に開発者の視点からの大きな違いはありません。そのため、デバイスがアイドル状態になったときに有線を含むあらゆる種類の接続を無効にできる3Dパーティーアプリがおそらくあります。

0

シェルスクリプトを設定して、デバイスがアイドルモードかどうかを確認できます。デバイスがアイドルの場合は
、デバイスに信号を送信できます。たとえば、次のようなadbシェルコマンドを使用できます。adb shell dumpsys deviceidle


興味深いことに、ネットワーク上でadbを動作させることができるかどうか、または代わりにSSHサーバーを使用できるかどうかを確認する必要があります。
ミカフィッシャー

しかし、dumpsys deviceidle少なくとも私の携帯電話では実際には機能しません(与えましたCan't find service: deviceidle)。
ミカフィッシャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.