{"record":{"id":"56f1478a457b53f5","repo":"microg/GmsCore","slug":"could-not-find-requested-camera","errorCode":null,"errorMessage":"Could not find requested camera.","messagePattern":"Could not find requested camera\\.","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"play-services-vision-common/src/main/java/com/google/android/gms/vision/CameraSource.java","lineNumber":354,"sourceCode":"            });\n            camera.addCallbackBuffer(new byte[(int) Math.ceil((double) ((long) (previewSize.getHeight() * previewSize.getWidth() * ImageFormat.getBitsPerPixel(parameters.getPreviewFormat()))) / 8.0D) + 1]);\n\n            return camera;\n        } catch (Exception e) {\n            camera.release();\n            throw e;\n        }\n    }\n\n    private int getFacingCameraId() throws IOException {\n        Camera.CameraInfo info = new Camera.CameraInfo();\n        for (int i = 0; i < Camera.getNumberOfCameras(); i++) {\n            Camera.getCameraInfo(i, info);\n            if (info.facing == facing) {\n                return i;\n            }\n        }\n        throw new IOException(\"Could not find requested camera.\");\n    }\n\n    private int[] pickFpsRange(Camera camera) throws IOException {\n        int requestsFpms = (int) (requestedFps * 1000.0F);\n        int[] selectedFpsRange = null;\n        int selectedPreviewFpsOffset = Integer.MAX_VALUE;\n\n        for (int[] previewFpsRange : camera.getParameters().getSupportedPreviewFpsRange()) {\n            int minOffset = requestsFpms - previewFpsRange[0];\n            int maxOffset = requestsFpms - previewFpsRange[1];\n            int previewFpsOffset;\n            if ((previewFpsOffset = Math.abs(minOffset) + Math.abs(maxOffset)) < selectedPreviewFpsOffset) {\n                selectedFpsRange = previewFpsRange;\n                selectedPreviewFpsOffset = previewFpsOffset;\n            }\n        }\n        if (selectedFpsRange == null) throw new IOException(\"Could not find suitable preview frames per second range.\");\n        return selectedFpsRange;","sourceCodeStart":336,"sourceCodeEnd":372,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-vision-common/src/main/java/com/google/android/gms/vision/CameraSource.java#L336-L372","documentation":"CameraSource.getFacingCameraId() iterates all hardware cameras via Camera.getCameraInfo() looking for one matching the requested facing (front/back) and throws IOException when no camera with that facing exists. This surfaces at camera-open time when the device simply lacks the requested camera.","triggerScenarios":"Requesting CameraSource with CameraInfo.CAMERA_FACING_FRONT (or back) on a device that has no front (or back) camera; calling start() on devices with a single rear camera when front was requested.","commonSituations":"Desktop/emulator or IoT devices without the requested camera; enterprise tablets with rear-only cameras; hardcoded FRONT camera assumption in code running on rear-only hardware.","solutions":["Detect available facings first by iterating Camera.getNumberOfCameras()/getCameraInfo and pick a supported one","Default to CAMERA_FACING_BACK if front is unavailable (or vice versa)","Show a user-facing message when the device lacks the requested camera","Guard start() in try/catch for IOException and fall back to the other facing"],"exampleFix":"// before\nCameraSource source = new CameraSource.Builder(context, detector)\n    .setFacing(CameraSource.CAMERA_FACING_FRONT)\n    .build();\nsource.start(); // IOException on devices without a front camera\n// after\nint facing = hasCamera(CameraInfo.CAMERA_FACING_FRONT)\n    ? CameraSource.CAMERA_FACING_FRONT : CameraSource.CAMERA_FACING_BACK;\ntry {\n    CameraSource source = new CameraSource.Builder(context, detector)\n        .setFacing(facing).build();\n    source.start();\n} catch (IOException e) {\n    // no suitable camera on this device\n}","handlingStrategy":"try-catch","validationCode":"boolean hasFacing(int facing) {\n    Camera.CameraInfo info = new Camera.CameraInfo();\n    for (int i = 0; i < Camera.getNumberOfCameras(); i++) {\n        Camera.getCameraInfo(i, info);\n        if (info.facing == facing) return true;\n    }\n    return false;\n}","typeGuard":"null","tryCatchPattern":"try {\n    cameraSource.start();\n} catch (IOException e) {\n    // no camera with the requested facing: fall back or inform the user\n}","preventionTips":["Enumerate available cameras and choose a supported facing dynamically","Default to back camera when front is unavailable","Never hardcode camera facing for arbitrary devices"],"tags":["vision","camera","hardware","io"],"backgroundTag":"resource-not-found","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}