//static readonly object locker = new object(); //static int requestCode = 0; //static Dictionary<PermissionType, (int requestCode, TaskCompletionSource<PermissionStatus> tcs)> requests = //new Dictionary<PermissionType, (int, TaskCompletionSource<PermissionStatus>)>(); //static void PlatformEnsureDeclared(PermissionType permission) internal static void EnsureDeclared(PermissionType permission) { var androidPermissions = permission.ToAndroidPermissions(onlyRuntimePermissions: false); // No actual android permissions required here, just return if (androidPermissions == null || !androidPermissions.Any()) { return; } var context = Platform.AppContext; foreach (var ap in androidPermissions) { var packageInfo = context.PackageManager.GetPackageInfo(context.PackageName, PackageInfoFlags.Permissions); var requestedPermissions = packageInfo?.RequestedPermissions; // If the manifest is missing any of the permissions we need, throw if (!requestedPermissions?.Any(r => r.Equals(ap, StringComparison.OrdinalIgnoreCase)) ?? false) { throw new UnauthorizedAccessException($"You need to declare the permission: `{ap}` in your AndroidManifest.xml"); } } }