在 Android TV 上收听 HDMI 插入和拔出事件

Posted

技术标签:

【中文标题】在 Android TV 上收听 HDMI 插入和拔出事件【英文标题】:Listen to HDMI plugged and unplugged events on Android TV 【发布时间】:2018-11-25 00:56:45 【问题描述】:

我需要为我的 android TV 应用接收 HDMI 状态事件。

我在几个地方找到了这段代码:

public class HdmiListener extends BroadcastReceiver 

    private static String HDMIINTENT = "android.intent.action.HDMI_PLUGGED";

    @Override
    public void onReceive(Context ctxt, Intent receivedIt) 
        String action = receivedIt.getAction();

        if (action.equals(HDMIINTENT)) 
            boolean state = receivedIt.getBooleanExtra("state", false);
        
    

在清单中有这个:

<receiver android:name="[package].HdmiListener" >
    <intent-filter>
        <action android:name="android.intent.action.HDMI_PLUGGED" />
    </intent-filter>
</receiver>

但是它不起作用。广播接收器永远不会被触发。

我对 AOSP 和其他项目进行了一些挖掘,并能够提出一个更完整的清单条目版本:

    <permission android:name="android.permission.TV_INPUT_HARDWARE"
        android:protectionLevel="signatureOrSystem"
        tools:ignore="SignatureOrSystemPermissions" />

    <permission android:name="android.permission.CAPTURE_TV_INPUT"
        android:protectionLevel="signatureOrSystem"
        tools:ignore="SignatureOrSystemPermissions" />

    <receiver android:name="[package].HdmiListener"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.HDMI_PLUG" />
            <action android:name="android.intent.action.HDMI_PLUGGED" />
            <action android:name="android.intent.action.TVOUT_PLUG" />
            <action android:name="android.media.action.HDMI_AUDIO_PLUG" />
        </intent-filter>
    </receiver>

但是还是不行 :-(

所以,我的问题是 - 有人让它真正起作用吗?还是如权限所暗示的那样,它只是系统级功能?

【问题讨论】:

能否提供错误日志? 嘿 :-) 没有错误日志。未触发 BroadcastReceiver :-( gist.github.com/oleynikd/1065521ee3236a60b804ad063020021f 【参考方案1】:

android.intent.action.HDMI_PLUGGEDFLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 标志。来自 Intent.java 中的评论:

 FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT

 * If set, when sending a broadcast before boot has completed only
 * registered receivers will be called -- no BroadcastReceiver components
 * will be launched.  Sticky intent state will be recorded properly even
 * if no receivers wind up being called.  If @link #FLAG_RECEIVER_REGISTERED_ONLY
 * is specified in the broadcast intent, this flag is unnecessary.
 *
 * <p>This flag is only for use by system sevices as a convenience to
 * avoid having to implement a more complex mechanism around detection
 * of boot completion.

至少,接收者应该通过调用registerReceiver来注册。

【讨论】:

以上是关于在 Android TV 上收听 HDMI 插入和拔出事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在树莓派上安装Android 6.0系统

应用程序发送 hdmi cec 命令

检测安卓设备中的HDMI端口

“直播频道”应用未检测到 TVInputService HDMI 频道

Android强制HDMI音频

为啥hdmi线插上音响没声音了?