diff --git a/platform/android/java/editor/src/horizonos/java/org/godotengine/editor/GodotEditor.kt b/platform/android/java/editor/src/horizonos/java/org/godotengine/editor/GodotEditor.kt index ba8947bcd90..42118da4d51 100644 --- a/platform/android/java/editor/src/horizonos/java/org/godotengine/editor/GodotEditor.kt +++ b/platform/android/java/editor/src/horizonos/java/org/godotengine/editor/GodotEditor.kt @@ -37,6 +37,16 @@ package org.godotengine.editor */ open class GodotEditor : BaseGodotEditor() { + override fun getExcludedPermissions(): MutableSet { + val excludedPermissions = super.getExcludedPermissions().apply { + // The AVATAR_CAMERA and HEADSET_CAMERA permissions are requested when `CameraFeed.feed_is_active` + // is enabled. + add("horizonos.permission.AVATAR_CAMERA") + add("horizonos.permission.HEADSET_CAMERA") + } + return excludedPermissions + } + override fun getXRRuntimePermissions(): MutableSet { val xrRuntimePermissions = super.getXRRuntimePermissions() xrRuntimePermissions.add("com.oculus.permission.USE_SCENE") diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt index d36425d712d..55dd2865437 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt @@ -185,16 +185,14 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe * * The permissions in this set will be requested on demand based on use cases. */ - private fun getExcludedPermissions(): MutableSet { + @CallSuper + protected open fun getExcludedPermissions(): MutableSet { val excludedPermissions = mutableSetOf( // The RECORD_AUDIO permission is requested when the "audio/driver/enable_input" project // setting is enabled. Manifest.permission.RECORD_AUDIO, // The CAMERA permission is requested when `CameraFeed.feed_is_active` is enabled. Manifest.permission.CAMERA, - ) - - excludedPermissions.add( // The REQUEST_INSTALL_PACKAGES permission is requested the first time we attempt to // open an apk file. Manifest.permission.REQUEST_INSTALL_PACKAGES, diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java index 81a8ebccd6d..5f6c068a246 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java @@ -148,31 +148,36 @@ public final class PermissionsUtil { return true; } + final List permissions = new ArrayList<>(); + final int requestCode; - final String updatedPermissionName; switch (permissionName) { case "RECORD_AUDIO": - updatedPermissionName = Manifest.permission.RECORD_AUDIO; + permissions.add(Manifest.permission.RECORD_AUDIO); requestCode = REQUEST_RECORD_AUDIO_PERMISSION; break; case "CAMERA": - updatedPermissionName = Manifest.permission.CAMERA; + permissions.add(Manifest.permission.CAMERA); + if (DeviceUtils.isHorizonOSDevice(activity)) { + // On HorizonOS, these permissions are required to get access to all the device's cameras. + permissions.add("horizonos.permission.AVATAR_CAMERA"); + permissions.add("horizonos.permission.HEADSET_CAMERA"); + } requestCode = REQUEST_CAMERA_PERMISSION; break; case "VIBRATE": - updatedPermissionName = Manifest.permission.VIBRATE; + permissions.add(Manifest.permission.VIBRATE); requestCode = REQUEST_VIBRATE_PERMISSION; break; default: - updatedPermissionName = permissionName; + permissions.add(permissionName); requestCode = REQUEST_SINGLE_PERMISSION_REQ_CODE; break; } - List permissions = Collections.singletonList(updatedPermissionName); return requestPermissions(activity, permissions, requestCode); }