在Android中如何检查HDMI设备的连接状态?

14

我需要检测我的 Android 设备是否连接了 HDMI 设备。为此,我正在使用 BroadcastReceiver 并且它也能够检测到。 但是,使用 BroadcastReceiver 时,我无法处理在启动我的应用程序之前就连接了 HDMI 设备的情况。在这种情况下,BroadcastReceiver 无法找到是否连接了任何 HDMI 设备。 有没有办法在任何时候知道是否连接了任何 HDMI 设备?


请分享您的广播接收器代码。它只适用于摩托罗拉设备吗? - Arpit Garg
2
这个答案对我起了作用,只需替换意图即可。不要使用“android.intent.action.HDMI_PLUGGED”,而要使用“android.intent.action.HDMI_HW_PLUGGED”。 (这本应是对那个答案的评论,但我的声誉不允许我评论)。 - Shah
5个回答

9
我结合其他答案和一些其他来源,得到了以下解决方案:
/**
 * Checks device switch files to see if an HDMI device/MHL device is plugged in, returning true if so.
 */
private boolean isHdmiSwitchSet() {

    // The file '/sys/devices/virtual/switch/hdmi/state' holds an int -- if it's 1 then an HDMI device is connected.
    // An alternative file to check is '/sys/class/switch/hdmi/state' which exists instead on certain devices.
    File switchFile = new File("/sys/devices/virtual/switch/hdmi/state");
    if (!switchFile.exists()) {
        switchFile = new File("/sys/class/switch/hdmi/state");
    }
    try {
        Scanner switchFileScanner = new Scanner(switchFile);
        int switchValue = switchFileScanner.nextInt();
        switchFileScanner.close();
        return switchValue > 0;
    } catch (Exception e) {
        return false;
    }
}

如果您经常检查,您需要存储结果并使用@hamen的监听器更新它。


我正在尝试在我的Android应用程序中实现类似的功能,即当通过HDMI连接的显示器关闭时,视频会暂停。您是否知道如果电视通过HDMI连接但处于关闭状态,文件是否保存了int 10?谢谢,任何帮助都将不胜感激。 - Raunaqss
不好意思。这个答案是从其他来源组合而成的,其中没有任何硬性答案。 - Tom

6
我最终得出了这个结果。它适用于S3和S4,并且应该适用于任何4+的Android版本。
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);

            if (state) {
                Log.d("HDMIListner", "BroadcastReceiver.onReceive() : Connected HDMI-TV");
                Toast.makeText(ctxt, "HDMI >>", Toast.LENGTH_LONG).show();    
            } else {
                Log.d("HDMIListner", "HDMI >>: Disconnected HDMI-TV");
                Toast.makeText(ctxt, "HDMI DisConnected>>", Toast.LENGTH_LONG).show();
            }
        }
    }
}

AndroidManifest.xml需要在应用程序标签中添加以下内容:

    <receiver android:name="__com.example.android__.HdmiListener" >
        <intent-filter>
            <action android:name="android.intent.action.HDMI_PLUGGED" />
        </intent-filter>
    </receiver>

3
这有助于我检测HDMI是否连接或断开,但在运行应用程序之前不知道HDMI是否已连接。 - jch
@IvanMorgillo @DmitryGinzburg 我正在尝试在我的安卓应用中实现类似的功能,当通过 HDMI 连接的显示器关闭时,我希望视频暂停。您知道如果电视通过 HDMI 连接但处于关机状态,这个函数会返回 true 还是 false 吗?谢谢,非常感谢任何帮助。 - Raunaqss
@Raunaqss 你做出决定了吗? - Aleksandr A
@AleksandrA,有多种可能的方法,你选择哪种方法取决于硬件、使用的Android版本等因素。尽管如此,谷歌使得访问其私有HDMI相关API变得困难。我可以详细阐述每种方法。你使用的是什么硬件和Android版本? - Raunaqss
@Raunaqss 感谢您的回复。 API 17和21,Minix X7和Minix U1分别为: - Aleksandr A

5
您可以从/sys/class/display/display0.hdmi/connect获取数据。如果文件内容为0,则表示HDMI未连接,否则如果是1,则表示HDMI已连接。
try {
    File file = new File("/sys/class/display/display0.hdmi/connect");
    InputStream in = new FileInputStream(file);
    byte[] re = new byte[32768];
    int read = 0;
    while ((read = in.read(re, 0, 32768)) != -1) {
        String string = new String(re, 0, read);
        Log.v("String_whilecondition", "HDMI state = " + string);
        result = string;
    }
    in.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

这是否意味着设备必须被root? - Adi
我认为没有必要对设备进行Root操作。 - Aj_31
SE Linux 可能会拒绝访问 sys 文件读取。 - Sergey

1

检查文件/sys/class/switch/hdmi/state,如果它是1,则连接到HDMI。


这是否意味着设备必须被root? - Adi

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接