因为用的是工控板,所以摄像头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 进行调换