【问题标题】:Detect changes in power status of a TV connected to an Android device via HDMI检测通过 HDMI 连接到 Android 设备的电视电源状态的变化
【发布时间】:2018-03-21 12:39:37
【问题描述】:

我正在构建一个 Android 媒体播放器应用程序,打算在通过 HDMI 电缆连接时在电视上播放媒体(视频、图片等)。

我想让媒体播放器应用程序在电视电源状态关闭时暂停,并希望它在电视打开时播放。

当我的 Android 设备通过 HDMI 连接到电视时,如何在我的 Android 应用程序中检测电视的电源状态?

电视和 Android 设备都支持 HDMI-CEC。有问题的设备是 ODROID C2。我在 KODI Android 应用程序上看到了这个功能,它具有在 HDMI-CEC 状态为 OFF 时暂停视频的功能,我也希望在我的应用程序中实现此功能。

感谢任何帮助。提前致谢!

编辑:下面的进度

我尝试从该文件/sys/devices/virtual/switch/hdmi/state 中读取 HDMI 连接的状态。但是,无论连接的屏幕/电视的电源状态是开还是关,这个文件都会保存int1

第二次进度更新

我仍在努力。不会放弃,一旦我完成了我一定会在这里发布答案。

【问题讨论】:

标签: android hdmi-cec


【解决方案1】:

您可以通过注册 ACTION_HDMI_AUDIO_PLUG 来监听 HDMI 状态的变化(0 表示拔出,1 表示插入)。当电视关闭、切换到任何其他显示媒体或 HDMI 被移除时,它会报告状态 0。要了解其技术性,您可以查看热插拔检测在 HDMI 中的工作原理。总体而言,您的应用程序可以随时监控显示器当前是否可以播放您的内容。我自己在一个解决方案(在 X96 mini android box 和 amazon fire-stick 上)实现了这一点,我需要确保内容实际上正在播放,因为它包含付费内容。另外,我附上了示例代码文件。 注意:此方案仅适用于 android 设备为 HDMI source 而不是 sink!

这里也是文档链接-https://developer.android.com/reference/android/media/AudioManager#ACTION_HDMI_AUDIO_PLUG

private BroadcastReceiver eventReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // pause video
        String action = intent.getAction();

        switch (action) {
            case ACTION_HDMI_AUDIO_PLUG :
                // EXTRA_AUDIO_PLUG_STATE: 0 - UNPLUG, 1 - PLUG
                Toast.makeText(getApplicationContext(),"HDMI PLUGGED OR UNPLUGGED",Toast.LENGTH_LONG).show();
                Log.d("MainActivity", "ACTION_HDMI_AUDIO_PLUG " + intent.getIntExtra(EXTRA_AUDIO_PLUG_STATE, -1));
                ((TextView)(findViewById(R.id.textView))).setText(((TextView)(findViewById(R.id.textView))).getText().toString().concat("At "+System.nanoTime()+": "+intent.getIntExtra(EXTRA_AUDIO_PLUG_STATE, -1) +"\n"));
                break;


        }
    }
};

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(eventReceiver);
}

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(ACTION_HDMI_AUDIO_PLUG);
    registerReceiver(eventReceiver, filter);

}

【讨论】:

    【解决方案2】:

    在某些电视中,您需要以 500 毫秒的间隔监控 (sys/class/amhdmitx/amhdmitx0/hpd_state) 文件夹的更改。因为它会在 1 秒内从 1 变为 0,再从 0 变为 1。

    【讨论】:

    • 请考虑在您的回答中添加更多信息
    • @Inder 在三星电视中,如果您通过 ADB Shell 使用 linux 'cat' 命令读取提到的路径,它将始终返回 1(TV_STATE_ON)。尝试在打开电视时以 ** 1 到 1.5 秒 ** 定期间隔连续读取该特定路径,它会在 1.5 秒内变为 0(TV_STATE_OFF)。之后它会再次显示 1(TV_STATE_ON)。这似乎是 SAMSUNG TV Side 的错误(虽然不确定)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多