附加USB设备的Android设备节点名称

时间:2014-06-10 14:42:29

标签: android java-native-interface usb webcam gstreamer

我目前正在为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设备的供应商&产品标识符是否以编程方式?

感谢。

2 个答案:

答案 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