rk3588 Android HDMI IN热插拔解决

一、前言

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文件修改的权限,这个问题交给自己或者厂家协商解决。下面是代码:

java 复制代码
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驱动起来延时两秒左右,这个需要自己去适配。

最后我就讲到这,希望能够帮助大家。

相关推荐
爱笑鱼2 小时前
Binder(八):远端进程死了,BinderProxy 为什么还能收到通知?
android
Android-Flutter2 小时前
Kotlin 冷流与热流详解
android·kotlin
zhangphil3 小时前
Android ContentProvider/ContentResolver读图片,跨进程 IPC慢
android
yueqc13 小时前
Android .so 文件压缩
android·so·包体积
龚礼鹏3 小时前
深入解析 Android Automotive (AAOS) 启动流程与 CarService 核心机制(基于 Android 16 最新源码视角)
android
rosmis3 小时前
agent各指标定义
android·java·开发语言
风样滴男人哟5 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
小孔龙6 小时前
RenderNode 与 DisplayList:Android 硬件加速的绘制记录与复用
android·性能优化
qizayaoshuap6 小时前
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)
android·华为·harmonyos
朝星6 小时前
Framework筑基之Handler消息机制5(应用层)
android