如何使用AndroidcameraX访问外部USB摄像头?

Ara*_* OR 5 android android-camera android-camerax

我正在按照此Codelab创建一个cameraX应用程序。

它在我的手机上运行良好。但我正在开发的应用程序是针对 Android 媒体播放器的。它没有任何内置摄像头,仅连接了外部 USB 摄像头。

这是我启动相机的代码。

private void startCamera() {
    ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    Preview preview = new Preview.Builder().build();
    preview.setSurfaceProvider(viewFinder.getSurfaceProvider());
    imageCapture = new ImageCapture.Builder().build();
    cameraProviderFuture.addListener(() -> {
                try {
                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    cameraProvider.unbindAll();
                    cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA,preview,imageCapture);
                } catch (ExecutionException e) {
                    e.printStackTrace();
                    Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
                catch (IllegalArgumentException e){
                    Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }, ContextCompat.getMainExecutor(this)
    );


}
Run Code Online (Sandbox Code Playgroud)

它抛出IllegalArgumentException说没有连接相机。

cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA,preview,imageCapture);

唯一CameraSelector.DEFAULT_FRONT_CAMERACameraSelector.DEFAULT_BACK_CAMERA 可用。

如何访问外部摄像头?

从 Play 商店打开相机应用程序运行良好。

小智 1

我已经解决了这个问题,你可以在这个网站找到我的项目代码:

\n

参考Java应用程序模块

\n

我创建一个过滤器:

\n
@SuppressLint("UnsafeExperimentalUsageError")\nclass MyCameraFilter implements CameraFilter {\n\n    @SuppressLint("RestrictedApi")\n    @NonNull\n    @Override\n    public LinkedHashSet<Camera> filter(@NonNull LinkedHashSet<Camera> cameras) {\n        Log.i(TAG, "cameras size: " + cameras.size());\n        Iterator<Camera> cameraIterator = cameras.iterator();\n        Camera camera = null;\n        while (cameraIterator.hasNext()) {\n            camera = cameraIterator.next();\n            String getImplementationType = camera.getCameraInfo().getImplementationType();\n            Log.i(TAG, "getImplementationType: " + getImplementationType);\n        }\n        LinkedHashSet linkedHashSet = new LinkedHashSet<>();\n        linkedHashSet.add(camera); // \xe6\x9c\x80\xe5\x90\x8e\xe4\xb8\x80\xe4\xb8\xaacamera\n        return linkedHashSet;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并将其传递给 CameraSelector:

\n
cameraSelector = new CameraSelector.Builder().addCameraFilter(new MyCameraFilter()).build();\n
Run Code Online (Sandbox Code Playgroud)\n

现在我可以访问 USB 摄像头了。我开发的 Android 芯片是 Android API 11\n日志“cameras size:”会告诉您有多少个相机连接到 USB。默认选择最后一个摄像机。

\n