Android UVCCamera扫描USB Device的过程和原理分析
UVCCamera工程中的测试用例,需要扫描USB设备并以列表的方式展示出来,这里以usbCameraTest
中的MainActivity
为例说明,其他示例也类似。
进入Activity一般都是黑屏,在左上角有一个按钮,这个按钮点击后会打开一个dialog样式的对话框,用来选择自己需要操作的USB设备,一般选择依据是通过设备的pid,vid来选择,前提是这个设备需要是支持UVC协议的摄像头,否则即使选了也不能预览摄像头画面。
1 | private final OnClickListener mOnClickListener = new OnClickListener() { |
上述代码中,CameraDialog.showDialog(MainActivity.this);
这一行就是展开对话框显示当前所有过滤的设备。
在CameraDialog
的onResume
方法中有updateDevices();
1 | public void updateDevices() { |
第一行便是调用getDeviceFilters
进行xml的解析,这里解析的是res下的xml中device_filter.xml
文件,将解析的内容放进list中:
1 | /** |
其中readEntryOne
表示读取其中一项内容,代码如下:
1 | public static DeviceFilter readEntryOne(final Context context, final XmlPullParser parser) |
这个解析是主要解析过程,后面会用到,这里要明白这个解析出来的规则后面会用来进行设备过滤,符合规则的设备就进行显示,不符合规则的设备就不显示。
这里解析主要解析了vendorId
,productId
,class
,subclass
,protocol
,manufacture
,serial
,exclude
等字段,也就是说这些字段其实都可以配置在xml中,如果xml中定义了这些内容,则会被解析到,如果没有定义,则返回结果为-1。exclude
字段是排除的意思,也就是如果定义了这个字段,则这一项xml为排除项,如果匹配上则要把这个device排除掉,这是一个反向过滤标志。
在读到xml的末尾标签,则会创建DeviceFilter
对象:
1 | } else if (eventType == XmlPullParser.END_TAG) { |
在之前的上一层会循环解析这个xml文件,将所有解析到的DeviceFilter
放在list里面,用于之后的设备匹配。
在updateDevices
的第二行可以看到:
1 | mDeviceListAdapter = new DeviceListAdapter(getActivity(), mUSBMonitor.getDeviceList(filter.get(0))); |
这里有个点需要注意,代码写的是:mUSBMonitor.getDeviceList(filter.get(0))
,如果想用filter
解析出来的xml项都进行匹配,则直接传入filter
即可,不用filter.get(0)
选择第一个,如果写了filter.get(0)
,则xml中的内容次序就会有关系,也就是说只会使用第一个进行匹配,其他的会忽略。
如果写filter.get(0)
,又想多匹配设备,则xml可以写成如下:
1 |
|
这里便进行了过滤匹配:
1 | /** |
对于mUsbManager
获取到的每个Device,如果设备的pid
,vid
和filter
中的匹配上,也就是相等,并且exclude
为false
(上面已经对该字段进行了说明),则把这个Device加入list,并赋值给Adapter进行展示。当然前提是需要有filter
,没有的话可以创建任意一个即可。
那么现在逻辑就清楚了,如果要想展示自己想要展示的设备,可以编辑xml文件,加入自己的设备的pid
,vid
即可,也可以以class
,subclass
等来进行过滤,这样很多设备可能都会满足条件。
UVCCamera相关内容
- Android UVCCamera 简介
- Android UVCCamera基本库介绍
- Android UVCCamera调用过程介绍
- 解决Android UVCCamera项目编译和运行报错的问题
- Android UVCCamera扫描USB Device的过程和原理分析
- Android UVCCamera闪退问题解决方法
- 解决UVCCamera拔出USB摄像头APP崩溃(闪退)的问题
- Android中多USB摄像头解决方案 —— UVCCamera
- UVCCamera源码分析(一)
- UVCCamera源码分析(二)
- UVCCamera源码分析(三)
- UVCCamera源码分析(四)
- UVCCamera源码分析(五)
参考链接:https://blog.csdn.net/bawang_cn/article/details/121166865