Camera.open() 得到 "Access for <package> has been restricted"

Camera.open() gets "Access for <package> has been restricted"

然而,当尝试 Camera.open(i) 检查相机属性时,我得到

I/CameraService: Camera 0: Access for "package" has been restricted

显然这只会发生 [1] 如果应用程序的包或 uId 已明确限制启动 AppOpsManager#OP_CAMERA。 但是为什么会这样呢?在 AppOpsManager#checkOp 之后说 AppOpsManager#MODE_ALLOWED

示例代码

for (int i = 0; i < numCameras; ++i) {
    List<Size> supportedSizes = null;
    List<int[]> supportedFpsRanges = null;
    Camera camera = null;
    try {
        camera = Camera.open(i);
        Parameters parameters = camera.getParameters();
        supportedSizes = parameters.getSupportedPreviewSizes();
        supportedFpsRanges = getFpsRangesRobust(parameters);
    } catch (Exception e) {
        ...
    } finally {
        if (camera != null) {
            camera.release();
        }
    }

[1] https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-mr1-release/services/core/java/com/android/server/AppOpsService.java#L2588

显然是设备问题。 诺基亚 6 / TA-1000,Android 7.1.1

场景

  • 尝试使用相机
  • 应用请求权限,点击拒绝
  • 尝试使用相机
  • 应用请求权限,点按允许
  • logcat 中出现错误,相机无法正常工作

可与任何其他应用程序重现,包括默认相机应用程序。