소스 검색

Merge pull request #107184 from m4gr3d/cleanup_horizonos_camera_permission_request

Fix the `CAMERA` permission request on HorizonOS devices
Rémi Verschelde 3 달 전
부모
커밋
847042e050

+ 10 - 0
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<String> {
+		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<String> {
 		val xrRuntimePermissions = super.getXRRuntimePermissions()
 		xrRuntimePermissions.add("com.oculus.permission.USE_SCENE")

+ 2 - 4
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<String> {
+	@CallSuper
+	protected open fun getExcludedPermissions(): MutableSet<String> {
 		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,

+ 11 - 6
platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java

@@ -148,31 +148,36 @@ public final class PermissionsUtil {
 			return true;
 		}
 
+		final List<String> 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<String> permissions = Collections.singletonList(updatedPermissionName);
 		return requestPermissions(activity, permissions, requestCode);
 	}