前面兩篇分別解決了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庫丟失,添加后即可。