美文网首页
Unity 安卓/ios权限插件

Unity 安卓/ios权限插件

作者: ShawnWeasley | 来源:发表于2020-08-06 10:20 被阅读0次

    前面两篇分别解决了Unity中安卓和ios权限的获取、被拒情况下的处理方法,这篇我们把他们整合成一整个插件。
    首先是调用方法,安卓和ios不一样,安卓可以拒绝后再由系统发起申请,ios则不行,因此安卓有三种状态,ios只有两种:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class PermissionsStateExample : MonoBehaviour
    {
        public Button m_AskMicrophonePermissionStateButton;
        public Button m_AskCameraPermissionStateButton;
        public Button m_AskReadPhotoPermissionStateButton;
        public Button m_AskWritePhotoePermissionStateButton;
        public Button m_OpenAppSettingsButton;
        void Start()
        {
            m_AskMicrophonePermissionStateButton.onClick.AddListener(GetMicrophonePermissionState);
            m_AskCameraPermissionStateButton.onClick.AddListener(GetCameraPermissionState);
            m_AskReadPhotoPermissionStateButton.onClick.AddListener(GetReadPhotoPermissionState);
            m_AskWritePhotoePermissionStateButton.onClick.AddListener(GetWritePhotoPermissionState);
            m_OpenAppSettingsButton.onClick.AddListener(OpenAppSettings);
        }
    
        void Update()
        {
    
        }
    
        void GetMicrophonePermissionState()
        {
            PermissionState permissionState = PermissionsState.GetMicrophonePermissionState();
    
            switch (permissionState)
            {
                case PermissionState.Allow:
                    Debug.Log("Microphone 权限允许");
                    break;
                case PermissionState.NotAllow:
                    Debug.Log("Microphone 权限不允许");
                    break;
                case PermissionState.WaitAsk:
                    Debug.Log("Microphone 等待询问");
                    break;
                default: break;
            }
        }
    
        void GetCameraPermissionState()
        {
            PermissionState permissionState = PermissionsState.GetCameraPermissionState();
    
            switch (permissionState)
            {
                case PermissionState.Allow:
                    Debug.Log("Camera 权限允许");
                    break;
                case PermissionState.NotAllow:
                    Debug.Log("Camera 权限不允许");
                    break;
                case PermissionState.WaitAsk:
                    Debug.Log("Camera 等待询问");
                    break;
                default: break;
            }
        }
    
        void GetWritePhotoPermissionState()
        {
            PermissionState permissionState = PermissionsState.GetWritePhotoPermissionState();
    
            switch (permissionState)
            {
                case PermissionState.Allow:
                    Debug.Log("WritePhoto 权限允许");
                    break;
                case PermissionState.NotAllow:
                    Debug.Log("WritePhoto 权限不允许");
                    break;
                case PermissionState.WaitAsk:
                    Debug.Log("WritePhoto 等待询问");
                    break;
                default: break;
            }
        }
    
        void GetReadPhotoPermissionState()
        {
            PermissionState permissionState = PermissionsState.GetReadPhotoPermissionState();
    
            switch (permissionState)
            {
                case PermissionState.Allow:
                    Debug.Log("ReadPhoto 权限允许");
                    break;
                case PermissionState.NotAllow:
                    Debug.Log("ReadPhoto 权限不允许");
                    break;
                case PermissionState.WaitAsk:
                    Debug.Log("ReadPhoto 等待询问");
                    break;
                default: break;
            }
        }
    
        void OpenAppSettings()
        {
            PermissionsState.OpenAppSettings();
        }
    }
    

    PermissionsState静态类:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    /// <summary>
    /// 移动端权限状态
    /// </summary>
    public static class PermissionsState
    {
        /// <summary>
        /// 获取麦克风权限状态
        /// ios使用此权限需在info中添加Privacy - Microphone Usage Description描述
        /// andriod使用此权限需在AndroidManifest文件中添加        <uses-permission android:name="android.permission.RECORD_AUDIO" />
        /// </summary>
        /// <returns>权限状态</returns>
        public static PermissionState GetMicrophonePermissionState()
        {
            PermissionState permissionState = PermissionState.NotAllow;
    #if UNITY_EDITOR || UNITY_STANDALONE_WIN
            permissionState = PermissionState.UnnecessaryPlatform;
    #elif UNITY_IOS || UNITY_IPHONE
            permissionState = UnityGetiOSPermissionsState.GetMicrophonePermissionState()?PermissionState.Allow:PermissionState.NotAllow;
    #elif UNITY_ANDROID
            AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.RECORD_AUDIO");
            switch (result)
            {
                case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                    permissionState = PermissionState.NotAllow;
                    break;
                case AndroidRuntimePermissions.Permission.Granted://允许
                    permissionState = PermissionState.Allow;
                    break;
                case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                    permissionState = PermissionState.WaitAsk;
                    break;
            }
    #endif
            return permissionState;
        }
    
        /// <summary>
        /// 获取相机权限状态
        /// ios使用此权限需在info中添加Privacy - Camera Usage Description描述
        /// andriod使用此权限需在AndroidManifest文件中添加        <uses-permission android:name="android.permission.CAMERA" />
        /// </summary>
        /// <returns>权限状态</returns>
        public static PermissionState GetCameraPermissionState()
        {
            PermissionState permissionState = PermissionState.NotAllow;
    #if UNITY_EDITOR || UNITY_STANDALONE_WIN
            permissionState = PermissionState.UnnecessaryPlatform;
    #elif UNITY_IOS || UNITY_IPHONE
            permissionState = UnityGetiOSPermissionsState.GetCameraPermissionState()?PermissionState.Allow:PermissionState.NotAllow;
    #elif UNITY_ANDROID
            AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.CAMERA");
            switch (result)
            {
                case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                    permissionState = PermissionState.NotAllow;
                    break;
                case AndroidRuntimePermissions.Permission.Granted://允许
                    permissionState = PermissionState.Allow;
                    break;
                case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                    permissionState = PermissionState.WaitAsk;
                    break;
            }
    #endif
            return permissionState;
        }
    
        /// <summary>
        /// 获取相册写入权限状态
        /// ios使用此权限需在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述。还需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework
        /// andriod使用此权限需在Unity-buildsetting-othersetting中的write permission(写入权限)为External(SDCard)
        /// </summary>
        /// <returns>权限状态</returns>
        public static PermissionState GetWritePhotoPermissionState()
        {
            PermissionState permissionState = PermissionState.NotAllow;
    #if UNITY_EDITOR || UNITY_STANDALONE_WIN
            permissionState = PermissionState.UnnecessaryPlatform;
    #elif UNITY_IOS || UNITY_IPHONE
            permissionState = UnityGetiOSPermissionsState.GetPhotoPermissionState()?PermissionState.Allow:PermissionState.NotAllow;
    #elif UNITY_ANDROID
            AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.WRITE_EXTERNAL_STORAGE");
            switch (result)
            {
                case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                    permissionState = PermissionState.NotAllow;
                    break;
                case AndroidRuntimePermissions.Permission.Granted://允许
                    permissionState = PermissionState.Allow;
                    break;
                case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                    permissionState = PermissionState.WaitAsk;
                    break;
            }
    #endif
            return permissionState;
        }
    
        /// <summary>
        /// 获取相册读取权限状态
        /// ios使用此权限需在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述。还需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework
        /// andriod使用此权限需在Unity-buildsetting-othersetting中的write permission(写入权限)为External(SDCard)
        /// </summary>
        /// <returns>权限状态</returns>
        public static PermissionState GetReadPhotoPermissionState()
        {
            PermissionState permissionState = PermissionState.NotAllow;
    #if UNITY_EDITOR || UNITY_STANDALONE_WIN
            permissionState = PermissionState.UnnecessaryPlatform;
    #elif UNITY_IOS || UNITY_IPHONE
            permissionState = UnityGetiOSPermissionsState.GetPhotoPermissionState()?PermissionState.Allow:PermissionState.NotAllow;
    #elif UNITY_ANDROID
            AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.READ_EXTERNAL_STORAGE");
            switch (result)
            {
                case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                    permissionState = PermissionState.NotAllow;
                    break;
                case AndroidRuntimePermissions.Permission.Granted://允许
                    permissionState = PermissionState.Allow;
                    break;
                case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                    permissionState = PermissionState.WaitAsk;
                    break;
            }
    #endif
            return permissionState;
        }
    
        /// <summary>
        /// 打开App设置界面
        /// </summary>
        /// <returns>权限状态</returns>
        public static void OpenAppSettings()
        {
    #if UNITY_EDITOR || UNITY_STANDALONE_WIN
    
    #elif UNITY_IOS || UNITY_IPHONE
            UnityGetiOSPermissionsState.OpenAppSettings();
    #elif UNITY_ANDROID
            AndroidRuntimePermissions.OpenSettings();
    #endif
        }
    }
    
    public enum PermissionState
    {
        //未允许
        NotAllow,
        //允许
        Allow,
        //等待询问
        WaitAsk,
        //不需要的平台
        UnnecessaryPlatform
    }
    

    如果不看上面两篇这里可能会比较吃力,但是懒人就方便了。
    用的时候注意一下使用注意点,我也写在README里了:

    ios使用注意:
    --使用麦克风权限
    在info中添加Privacy - Microphone Usage Description描述
    --使用相机权限
    在info中添加Privacy - Camera Usage Description描述
    --使用读取相册权限
    在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述
    还需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework

    安卓使用注意:
    需修改Unity 默认AndroidManifest文件,文件路径为
    Mac系统:Unity.app安装同级目录: PlaybackEngines/AndroidPlayer/Apk/
    Win系统:Unity安装目录下面(如果hub安装的就有hub,非hub安装的就少hub这一层,可以桌面右键图标打开文件所在位置)C:\Program Files\Unity\Hub\Editor\2019.4.5f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
    在文件中添加需要的权限:
    --使用麦克风权限
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    --使用相机权限
    <uses-permission android:name="android.permission.CAMERA" />
    --使用读取相册权限
    在unity导出设置othersetting中的write permission(写入权限)设置为External(SDCard)

    插件下载地址:
    链接: https://pan.baidu.com/s/1JTyjvZERAA_h0rYsOEy8xg
    提取码: ebuy

    相关文章

      网友评论

          本文标题:Unity 安卓/ios权限插件

          本文链接:https://www.haomeiwen.com/subject/uqbirktx.html