一、前言
1、公司在使用 别的厂商的板卡遇到一个问题,开机我们的app自启就会闪退,后来定位发现是camera 的open出错了,这个问题的出现是因为没有插HDMI IN输入的问题导致的,所以需要对HDMI IN的热插拔进行检测,后面我把这个问题也顺利解决了。下面是我的尝试和使用的解决办法。
二、尝试广播
1、尝试使用广播的形式去解决这个问题,网上也是能够搜到对应的文章: www.cnblogs.com/fuccc/p/767…
2、后来发现广播并没有反应没有任何效果,后来上网搜索好像找到了原因,大概如下图吧。
三、尝试读取系统文件
1、也是上面搜索到的文章提示我尝试读取系统文件
2、同时我也查阅了RK官方的HMDI IN的开发指南Rockchip HDMI IN开发指南 (nnewn.com),得出结论:
可以尝试通过读取文件查询状态,或者,我是说或者有可能通过TIF可以检测HDMI IN的状态,因为,文中也提到了camera和tv进行了交互。
3、话不多说,我用的是读取系统文件实现的,但是这个方法,需要有status文件的系统读权限,可以修改设备下的/vendor/etc/init/hw/init.rk3588.rc文件修改的权限,这个问题交给自己或者厂家协商解决。下面是代码:
public class HdmiService {
private static final String TAG = "HdmiService";
private boolean threadStatus; //线程状态,为了安全终止线程
// 实时读取文件
private File mHmdiRx = null;
private FileReader mHdmiRxReader = null;
private BufferedReader mHdmiBufReader = null;
// rk的HDMI IN路径和别的不太一样
private String mHdmiRxDevicePath = "/sys/kernel/debug/hdmirx/status";
private String mFristStrStatus = "";
private static HdmiService instance = new HdmiService();
public static HdmiService getInstance() {
return instance;
}
public void init(){
Log.d(TAG, "init :read thread run");
mHmdiRx = new File(mHdmiRxDevicePath);
threadStatus = false;
ReadThread readThread = new ReadThread();
readThread.start();
}
private class ReadThread extends Thread{
@Override
public void run() {
super.run();
while (!threadStatus){
// Log.d(TAG, "read thread run");
try {
Thread.sleep(800);
// 读取首行内容
mHdmiRxReader = new FileReader(mHmdiRx);
mHdmiBufReader = new BufferedReader(mHdmiRxReader);
String firstLine = mHdmiBufReader.readLine();
mHdmiBufReader.close();
// 处理读取到的首行内容
if (firstLine != null) {
mFristStrStatus = firstLine;
HdmiRxUtil.getInstance().StatusChange(mFristStrStatus);
}
}catch (IOException e) {
Log.d(TAG, "run: read data exception:" +e.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
三、注意 检测到了HDMI IN 插入的状态之后,需要等HDMI IN驱动起来延时两秒左右,这个需要自己去适配。
最后我就讲到这,希望能够帮助大家。