Unity 安卓/ios权限插件

前面两篇分别解决了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


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)

调研后发现是CoreTelephony.framework库丢失,添加后即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容