我目前正在为Android nexus 5手机编写应用程序。该应用程序使用gstreamer本机运行来访问已插入设备的USB网络摄像头。为了访问网络摄像头,我需要网络摄像头的设备节点位置。通常它是/ dev / video3但有时它会改变值,即/ dev / video4
目前我必须手动设置设备节点位置才能使用。我希望自动渲染过程。特别是考虑到用户可以断开并重新连接网络摄像头的情况。
到目前为止,我可以从Java确定vendorID,productID,然后使用JNI将此信息传递给我的C代码。
我使用以下方法检测USB设备信息:
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action))
{
deviceFound = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
Log.i("TAG", "USB DEVICE ATTACHED");
deviceFound.getDeviceName();
deviceFound.getVendorId();
deviceFound.getProductId();
}
getDeviceName返回包含" / dev / bus / usb / 001/002"的字符串。如果我尝试使用它来使用gstreamer访问我的网络摄像头,我会收到以下错误"错误获取设备的功能' / dev / bus / usb / 001/002':它不是' ta v4l2驱动器"
我假设/ dev / bus / usb / 002/001在这种情况下与/ dev / video3完全相同。几个问题:
1)我可以使用/ dev / bus / usb / 001/002获取正确的设备节点即/ dev / video3吗?
2)有没有办法直接获得设备节点(/ dev / video *)给定USB设备的供应商&产品标识符是否以编程方式?
感谢。
答案 0 :(得分:0)
检查/dev/video*
中所有候选人的修改时间。您正在寻找接近USB_DEVICE_ATTACHED
行动时间的那个。
答案 1 :(得分:0)
Android具有USB附件API (android.hardware.usb),您可以在其中将任何USB设备与android设备连接或分离并添加
进行显示,并将此意图过滤器过滤为
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
清单中的活动
UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
由此您可以获取USB的系统服务
UsbAccessory[] accessories = mUsbManager.getAccessoryList();
您将获得当前连接的USB附件的列表。它会报告其制造商和型号名称,配件的版本以及该设备的用户可见的配件说明。
HashMap<String,UsbDevice> result= mUsbManager.getDeviceList()
返回一个HashMap,其中包含当前连接的所有USB设备。 USB设备名称是返回的HashMap的密钥。 UsbDevice包含制造商和型号名称,版本等。
有关详细说明,请阅读Android Developer