使用 Android-Camera2 API 访问 USB 相机

2022-09-03 18:13:59

我有一个UVC相机,想要从我的Android Pie(Android 9)代码中访问和抓取帧。

这是我用来枚举连接到Android手机的相机的代码:

    @Override
    public void onResume()
    {
        CameraManager manager =
                (CameraManager)getSystemService(CAMERA_SERVICE);
        try {
            for (String cameraId : manager.getCameraIdList()) {
                CameraCharacteristics chars
                        = manager.getCameraCharacteristics(cameraId);
                // Do something with the characteristics
                int deviceLevel = chars.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
                Log.d(TAG, " **** device ["+cameraId+"] level:"+deviceLevel);
            }
        } catch(CameraAccessException e){
            e.printStackTrace();
        }
    }

我正在跳上Android 9 / Pie(Pixel 3),这显示了连接的USB相机。但只有两个设备被列出,前置和后置摄像头与手机相连。

这是我的清单文件(AndroidManifest.xml)中的功能和权限列表:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.usb.host" />

我无法在互联网上找到任何示例代码如何实现这一目标,即在Android 9及更高版本上使用USB相机访问USB相机。

我缺少什么来让我的代码枚举USB相机?我看过一些适用于Android的第三方UVC库,但我不想使用它们,而是想使用原生Android代码。


答案 1

您可以调用 PackageManager.hasSystemFeature,并使用常量FEATURE_CAMERA_EXTERNAL来检查您的设备是否支持外部摄像头。Pixel 3 不支持此功能。

实际上,有多个库和应用程序,它们提供USB相机支持。但是他们不使用Android API并自己实现所有内容。最常见的方法似乎是使用Linux内核模块的视频(如果内核是用这个模块编译的)。它还需要访问设备的权限,这在无根设备上通常不是这种情况。但实现相当简单。例如,android-webcam使用这种方法。/dev/video

另一种方法是使用USB主机API并自己实现所有协议。这不需要root访问权限,但实现要复杂得多。您可以检查这个以这种方式运行的库


答案 2

我想我找到了自己问题的答案。我购买了三星Galaxy S10e,并且相同的确切代码无需任何修改即可返回USB相机作为列表中的第一个相机。也就是说,这条线打印了3次,一次用于USB相机,两次用于内部相机。Log.d(TAG, " **** device ["+cameraId+"] level:"+deviceLevel);

我最好的猜测是,在Android 9发布时,在2018年10月之后设计和制造的大多数手机都启用了此功能。大约在那个时候或之前发布的手机,后来收到了Android 9(Pie)的更新,不太可能具有此功能。


推荐