需求:通过安卓系统获取HDMI连接状态。
安卓获取HDMI连接状态有两种方法,一种是通过系统广播监听;另一种是读取系统文件,从而判断HDMI的连接状态。
2.1 HDMI到底是啥?
HDMI(High Definition MultimediaInterface )中文名叫高清晰度多媒体接口,是一种数字化视频/音频接口技术,是适合影像传输的专用型数字化接口,其可同时传送音频和影像信号,最高数据传输速度为18Gbps(2.0版)。
2.2 HDMI传输原理
看了网上的资料后,个人对HDMI的传输原理理解为:HDMI接口中一共有19个引脚,其中每个引脚有自己的作用,中间有那么几个引脚传输信号,第18引脚是供电的,最后一个引脚(第19个引脚)是用来提供支持HDMI热拔插的(热拔插:简而言之就是在不关闭设备的情况可以对HDMI线进行拔插并且不影响设备的运行),实现热拔插的过程是电压从18引脚进,19引脚出,获取18、19两个引脚见的电压如果低于0.5V就判定为此时HDMI已断开。
2.3 安卓监测原理
网上介绍了两种监测方法,一种是通过广播来监听,另一种是通过读取系统文件来判断。监测的手段就是通过安卓底层驱动对19引脚就行监听,HDMI线的插拔会触发广播事件。通过读取文件来判断就是,底层驱动会根据HDMI的通断状态创建一个文件,文件中存放设备的信息,包括连接状态,读取文件时把这个文件中标志设备状态的状态拿出来,以此判断HDMI的连接状态。
2.3.1 通过广播监听代码实例:
private static BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent receivedIt) {
String action = receivedIt.getAction();
if (action.equals("android.intent.action.HDMI_PLUGGED")) {//HDMI插拔的广播事件
boolean state = receivedIt.getBooleanExtra("state", false);//事件返回一个Boolean类型的state值,根据state值可以判断其状态,true表已连接,false表断开。
if (state) {
isHdmiConnect = true;
} else {
isHdmiConnect = false;
}
}
}
};
2.3.2 通过读取系统文件判断HDMI连接状态代码实例:
/**
* 广播只能监听HDMI的插拔 第一次进入程序时不知道HDMI的连接状态
* 此时需要去读系统文件去判断HDMI的连接状态
*
* @return true 连接 false 未连接
*/
public static 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;
}
}
网友评论