Unity 安卓/ios權(quán)限插件

前面兩篇分別解決了Unity中安卓和ios權(quán)限的獲取、被拒情況下的處理方法,這篇我們把他們整合成一整個插件。
首先是調(diào)用方法,安卓和ios不一樣,安卓可以拒絕后再由系統(tǒng)發(fā)起申請,ios則不行,因此安卓有三種狀態(tài),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 權(quán)限允許");
                break;
            case PermissionState.NotAllow:
                Debug.Log("Microphone 權(quán)限不允許");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("Microphone 等待詢問");
                break;
            default: break;
        }
    }

    void GetCameraPermissionState()
    {
        PermissionState permissionState = PermissionsState.GetCameraPermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("Camera 權(quán)限允許");
                break;
            case PermissionState.NotAllow:
                Debug.Log("Camera 權(quán)限不允許");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("Camera 等待詢問");
                break;
            default: break;
        }
    }

    void GetWritePhotoPermissionState()
    {
        PermissionState permissionState = PermissionsState.GetWritePhotoPermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("WritePhoto 權(quán)限允許");
                break;
            case PermissionState.NotAllow:
                Debug.Log("WritePhoto 權(quán)限不允許");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("WritePhoto 等待詢問");
                break;
            default: break;
        }
    }

    void GetReadPhotoPermissionState()
    {
        PermissionState permissionState = PermissionsState.GetReadPhotoPermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("ReadPhoto 權(quán)限允許");
                break;
            case PermissionState.NotAllow:
                Debug.Log("ReadPhoto 權(quán)限不允許");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("ReadPhoto 等待詢問");
                break;
            default: break;
        }
    }

    void OpenAppSettings()
    {
        PermissionsState.OpenAppSettings();
    }
}

PermissionsState靜態(tài)類:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 移動端權(quán)限狀態(tài)
/// </summary>
public static class PermissionsState
{
    /// <summary>
    /// 獲取麥克風(fēng)權(quán)限狀態(tài)
    /// ios使用此權(quán)限需在info中添加Privacy - Microphone Usage Description描述
    /// andriod使用此權(quán)限需在AndroidManifest文件中添加        <uses-permission android:name="android.permission.RECORD_AUDIO" />
    /// </summary>
    /// <returns>權(quán)限狀態(tài)</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://權(quán)限被拒絕且不再詢問
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允許
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒絕權(quán)限但不拒絕詢問
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 獲取相機(jī)權(quán)限狀態(tài)
    /// ios使用此權(quán)限需在info中添加Privacy - Camera Usage Description描述
    /// andriod使用此權(quán)限需在AndroidManifest文件中添加        <uses-permission android:name="android.permission.CAMERA" />
    /// </summary>
    /// <returns>權(quán)限狀態(tài)</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://權(quán)限被拒絕且不再詢問
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允許
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒絕權(quán)限但不拒絕詢問
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 獲取相冊寫入權(quán)限狀態(tài)
    /// ios使用此權(quán)限需在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述。還需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework
    /// andriod使用此權(quán)限需在Unity-buildsetting-othersetting中的write permission(寫入權(quán)限)為External(SDCard)
    /// </summary>
    /// <returns>權(quán)限狀態(tài)</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://權(quán)限被拒絕且不再詢問
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允許
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒絕權(quán)限但不拒絕詢問
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 獲取相冊讀取權(quán)限狀態(tài)
    /// ios使用此權(quán)限需在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述。還需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework
    /// andriod使用此權(quán)限需在Unity-buildsetting-othersetting中的write permission(寫入權(quán)限)為External(SDCard)
    /// </summary>
    /// <returns>權(quán)限狀態(tài)</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://權(quán)限被拒絕且不再詢問
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允許
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒絕權(quán)限但不拒絕詢問
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 打開App設(shè)置界面
    /// </summary>
    /// <returns>權(quán)限狀態(tài)</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使用注意:
--使用麥克風(fēng)權(quán)限
在info中添加Privacy - Microphone Usage Description描述
--使用相機(jī)權(quán)限
在info中添加Privacy - Camera Usage Description描述
--使用讀取相冊權(quán)限
在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述
還需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework

安卓使用注意:
需修改Unity 默認(rèn)AndroidManifest文件,文件路徑為
Mac系統(tǒng):Unity.app安裝同級目錄: PlaybackEngines/AndroidPlayer/Apk/
Win系統(tǒng):Unity安裝目錄下面(如果hub安裝的就有hub,非hub安裝的就少hub這一層,可以桌面右鍵圖標(biāo)打開文件所在位置)C:\Program Files\Unity\Hub\Editor\2019.4.5f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
在文件中添加需要的權(quán)限:
--使用麥克風(fēng)權(quán)限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
--使用相機(jī)權(quán)限
<uses-permission android:name="android.permission.CAMERA" />
--使用讀取相冊權(quán)限
在unity導(dǎo)出設(shè)置othersetting中的write permission(寫入權(quán)限)設(shè)置為External(SDCard)

插件下載地址:
鏈接: https://pan.baidu.com/s/1JTyjvZERAA_h0rYsOEy8xg
提取碼: ebuy


2021.4.28更新
有小伙伴說ios打包的時候碰到如下問題:

Undefined symbols for architecture arm64: "_OBJC_CLASS_$_CTCellularData", referenced from: objc-class-ref in Permission.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

調(diào)研后發(fā)現(xiàn)是CoreTelephony.framework庫丟失,添加后即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容