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()
    {
    }
}