Android 处理双目摄像头Id 随机变动问题

文章讲述了在工控板上使用android.hardware.CameraAPI时,由于设备重启可能导致摄像头加载顺序变化的问题。为解决此问题,文章提供了一个函数funsupportBinocularCamera()来检查是否支持双目摄像头,并通过shell命令检查Bgr和Ir摄像头的ID,确保在非主线程中正确识别和设置摄像头的预览ID。
摘要由CSDN通过智能技术生成

因为用的是工控板,所以摄像头API使用的是

android.hardware.Camera

因为厂商原因未对摄像头加载顺序进行控制,所以导致设备重启时摄像头的加载顺序可能会有变动.

首先处理设备摄像头数量是否有2个

    //是否支持双目摄像头
    fun supportBinocularCamera(): Boolean {
        return Camera.getNumberOfCameras() >= 2
    }

然后用shell 命令查询设备加载usb设备列表信息.默认bgr Camera id 为0,ir Camera id为1

	/**
     * 检查双目摄像头的id
     * 该操作需要在非主线程执行,或协程中执行
     * first bgr
     * second ir
     */
    suspend fun checkBgrAndIrCameraId(): Pair<Int, Int> {
        var cameraBgr = 0
        var cameraIr = 1

        val res = ShellUtils.execCmd("cat /proc/bus/input/devices", false)
        val successMsg = res.successMsg
        if (successMsg.isNotEmpty()) {
            val lines = successMsg.reader().readLines()
            var bgrLine = -1
            var irLine = -1
            val bgrReg = "Name=\"USB 2.0 Camera\""
            val irReg = "Name=\"IR  Camera\""

            for (i in lines.indices) {
                val s = lines[i]
                if (s.contains(bgrReg)) {
                    bgrLine = i
                }
                if (s.contains(irReg)) {
                    irLine = i
                }
                if (bgrLine != -1 && irLine != -1) {
                    break
                }
            }
            if (bgrLine != -1 && irLine != -1 && irLine < bgrLine) {
                cameraBgr = 1
                cameraIr = 0
            }
        }
        return Pair(cameraBgr, cameraIr)
    }

如下是本机 shell命令查询设备usb设备列表

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="rk29-keypad"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/ff100000.adc/key.35/input/input0
U: Uniq=
H: Handlers=event0 ddr_freq keychord
B: PROP=0
B: EV=3
B: KEY=8000 1e0040 0 0 0

I: Bus=0019 Vendor=0002 Product=0002 Version=0200
N: Name="zx_ir"
P: Phys=input/zx_ir
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=sysrq event1 ddr_freq
B: PROP=0
B: EV=3
B: KEY=3 fffffffe

I: Bus=0003 Vendor=0c45 Product=6367 Version=0100
N: Name="IR  Camera"
P: Phys=usb-ff540000.usb-1.1/button
S: Sysfs=/devices/ff540000.usb/usb4/4-1/4-1.1/4-1.1:1.0/input/input2
U: Uniq=
H: Handlers=event2 ddr_freq
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0 0 0 0

I: Bus=0003 Vendor=222a Product=0001 Version=0110
N: Name="ILITEK ILITEK-TP"
P: Phys=usb-ff540000.usb-1.2/input0
S: Sysfs=/devices/ff540000.usb/usb4/4-1/4-1.2/4-1.2:1.0/input/input3
U: Uniq=
H: Handlers=event3 cpufreq ddr_freq
B: PROP=2
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=2608000 3

I: Bus=0003 Vendor=0c45 Product=636b Version=0100
N: Name="USB 2.0 Camera"
P: Phys=usb-ff540000.usb-1.4/button
S: Sysfs=/devices/ff540000.usb/usb4/4-1/4-1.4/4-1.4:1.0/input/input4
U: Uniq=
H: Handlers=event4 ddr_freq
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0 0 0 0

N:设备名称【Name】
P:系统层次结构中设备的物理路径【Physical path】
S:系统文件路径【Sysfs path】
U:设备的唯一识别码,可以为空【Unique identification code】
H:与设备关联的输入句柄列表【Handles】
B:位掩码,以十六进制表示【Bitmasks】
PROP:设备属性【Properties】
EV :设备支持的事件类型【Events】
KEY :设备拥有的键盘、按键
MSC :设备支持的杂项事件
LED :设备上的 LED

可以看到 ir camera 比 bgr camera 先加载, 然后根据摄像头加载顺序对预览的摄像头id 进行调换

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值