Unity的Android权限
权限有多种类型,有的权限只需要在AndroidManifest里面写明,而有的权限则需要使用Unity显式地弹窗申请权限。
首先在AndroidManifest中申请权限
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.hardware.vulkan.version"
android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch.distinct"
android:required="false" />
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
其次,在Unity中申请权限
与权限有关的API:
- HasUserAuthorizedPermission,判断是否有权限
- RequestUserPermissions:申请多个权限
- RequestUserPermission:申请一个权限
如果自定义PermissionManager,在运行到下面这句话的时候会崩溃。
// private PermissionManager p = new PermissionManager(); //这句话会崩溃
using UnityEngine;
using UnityEngine.Android;
public class Main : MonoBehaviour
{
// Start is called before the first frame update
class PermissionManager : PermissionCallbacks
{
public PermissionManager()
{
// this.PermissionDenied += x => { Log("权限申请被拒绝"); };
// this.PermissionGranted += x => { Log("权限已授权"); };
// this.PermissionDeniedAndDontAskAgain += x => { Log("权限已被拒绝且不再提示"); };
}
}
// private PermissionManager p = new PermissionManager(); //这句话会崩溃
static void Log(string s)
{
Debug.Log(s);
}
void Start()
{
var permissions = new[]
{
Permission.Camera,
Permission.Microphone,
Permission.CoarseLocation,
Permission.FineLocation,
Permission.ExternalStorageRead,
Permission.ExternalStorageWrite,
};
foreach (var i in permissions)
{
if (!Permission.HasUserAuthorizedPermission(i))
{
Permission.RequestUserPermission(i);
}
}
Permission.RequestUserPermissions(permissions);
}
// Update is called once per frame
void Update()
{
}
}