#if UNITY_ANDROID && !UNITY_EDITOR using UnityEngine.Android; #endif #if UNITY_IOS && !UNITY_EDITOR using System.Collections; using UnityEngine.iOS; #endif using System; using UnityEngine; namespace Photon.Voice.Unity.UtilityScripts { /// /// Helper to request Microphone permission on Android or iOS. /// [RequireComponent(typeof(Recorder))] public class MicrophonePermission : VoiceComponent { private Recorder recorder; #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR private bool isRequesting; #endif private bool hasPermission; public static event Action MicrophonePermissionCallback; [SerializeField] private bool autoStart = true; public bool HasPermission { get { return this.hasPermission; } private set { this.Logger.LogInfo("Microphone Permission Granted: {0}", value); MicrophonePermissionCallback?.Invoke(value); if (this.hasPermission != value) { this.hasPermission = value; if (this.hasPermission) { this.recorder.AutoStart = this.autoStart; } } } } protected override void Awake() { base.Awake(); this.recorder = this.GetComponent(); this.recorder.AutoStart = false; this.InitVoice(); } #if UNITY_IOS && !UNITY_EDITOR IEnumerator PermissionCheck() { this.isRequesting = true; this.Logger.LogInfo("iOS Microphone Permission Request"); yield return Application.RequestUserAuthorization(UserAuthorization.Microphone); this.isRequesting = false; if (Application.HasUserAuthorization(UserAuthorization.Microphone)) { this.HasPermission = true; } else { this.HasPermission = false; } } #endif public void InitVoice() { #if UNITY_ANDROID && !UNITY_EDITOR if (Permission.HasUserAuthorizedPermission(Permission.Microphone)) { this.HasPermission = true; } else { this.Logger.LogInfo("Android Microphone Permission Request"); #if UNITY_2020_2_OR_NEWER var callbacks = new PermissionCallbacks(); callbacks.PermissionDenied += PermissionCallbacks_PermissionDenied; callbacks.PermissionGranted += PermissionCallbacks_PermissionGranted; callbacks.PermissionDeniedAndDontAskAgain += PermissionCallbacks_PermissionDeniedAndDontAskAgain; Permission.RequestUserPermission(Permission.Microphone, callbacks); #else Permission.RequestUserPermission(Permission.Microphone); #endif this.isRequesting = true; } #elif UNITY_IOS && !UNITY_EDITOR this.StartCoroutine(this.PermissionCheck()); #else this.HasPermission = true; #endif } #if UNITY_ANDROID && !UNITY_EDITOR #if UNITY_2020_2_OR_NEWER internal void PermissionCallbacks_PermissionDeniedAndDontAskAgain(string permissionName) { this.isRequesting = false; this.HasPermission = false; this.Logger.LogInfo($"{permissionName} PermissionDeniedAndDontAskAgain"); } internal void PermissionCallbacks_PermissionGranted(string permissionName) { this.isRequesting = false; this.HasPermission = true; this.Logger.LogInfo($"{permissionName} PermissionGranted"); } internal void PermissionCallbacks_PermissionDenied(string permissionName) { this.isRequesting = false; this.HasPermission = false; this.Logger.LogInfo($"{permissionName} PermissionDenied"); } #else private void OnApplicationFocus(bool focus) { if (focus && this.isRequesting) { if (Permission.HasUserAuthorizedPermission(Permission.Microphone)) { this.HasPermission = true; } else { this.HasPermission = false; } this.isRequesting = false; } } #endif #endif } }