前面两篇分别解决了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;
///
/// 移动端权限状态
///
public static class PermissionsState
{
///
/// 获取麦克风权限状态
/// ios使用此权限需在info中添加Privacy - Microphone Usage Description描述
/// andriod使用此权限需在AndroidManifest文件中添加
///
/// 权限状态
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;
}
///
/// 获取相机权限状态
/// ios使用此权限需在info中添加Privacy - Camera Usage Description描述
/// andriod使用此权限需在AndroidManifest文件中添加
///
/// 权限状态
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;
}
///
/// 获取相册写入权限状态
/// 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)
///
/// 权限状态
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;
}
///
/// 获取相册读取权限状态
/// 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)
///
/// 权限状态
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;
}
///
/// 打开App设置界面
///
/// 权限状态
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
在文件中添加需要的权限:
--使用麦克风权限
--使用相机权限
--使用读取相册权限
在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库丢失,添加后即可。