Unity-Android 权限相关问题

1. 生成AndroidManifest

File -> buildSetting->playerSetting->Android->publishing Settings

image
image
image
image

权限添加位置:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <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>

    <!--网络相关-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!--防止通话过程中锁屏-->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <!--视频权限-->
    <uses-permission android:name="android.permission.CAMERA"/>
    <!--录音权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!--修改音频设置-->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <!--蓝牙权限-->
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <!--蓝牙连接权限,此权限还需在运行应用时动态申请,否则 Android 12 及以上的设备蓝牙无法正常工作-->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <!--外置存储卡写入权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <!-- Android11额外添加 -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
    
    

    <!--蓝牙 startBluetoothSco 会用到此权限-->
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    <!--获取设备信息-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--允许应用程序使用camera硬件资源-->
    <uses-feature android:name="android.hardware.camera"/>
    <!--自动对焦-->
    <uses-feature android:name="android.hardware.camera.autofocus"/>
    
</manifest>

2. 连续请求多个权限

  • unity请求权限的时候,如果连续请求多个权限,因为unity焦点问题,会屏蔽掉第一个权限以外的权限申请。这个可以用以下代码解决:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Android;

public class PermissionManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
    StartCoroutine(AskForPermissions());
#endif
    }


    private IEnumerator AskForPermissions()
    {
        //判断是否已经包含该权限,防止每次启动应用都需要请求
        List<bool> permissions = new List<bool>() { false, false, false, false };
        List<bool> permissionsAsked = new List<bool>() { false, false, false, false };
        List<Action> actions = new List<Action>()
        {
        //注册请求事件
            new Action(() => {
                permissions[0] = Permission.HasUserAuthorizedPermission(Permission.Microphone);
                if (!permissions[0] && !permissionsAsked[0])
                {
                    Permission.RequestUserPermission(Permission.Microphone);
                    permissionsAsked[0] = true;
                    return;
                }
            }),
            new Action(() => {
                permissions[1] = Permission.HasUserAuthorizedPermission(Permission.Camera);
                if (!permissions[1] && !permissionsAsked[1])
                {
                    Permission.RequestUserPermission(Permission.Camera);
                    permissionsAsked[1] = true;
                    return;
                }
            }),
            new Action(() => {
                permissions[2] = Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite);
                if (!permissions[2] && !permissionsAsked[2])
                {
                    Permission.RequestUserPermission(Permission.ExternalStorageWrite);
                    permissionsAsked[2] = true;
                    return;
                }
            }),
            new Action(() => {
                permissions[3] = Permission.HasUserAuthorizedPermission("android.permission.READ_PHONE_STATE");
                if (!permissions[3] && !permissionsAsked[3])
                {
                    Permission.RequestUserPermission("android.permission.READ_PHONE_STATE");
                    permissionsAsked[3] = true;
                    return;
                }
            })
        };
        for(int i = 0; i < permissionsAsked.Count; )
        {
            //invoke 同步请求,只有当结果返回的时候才会执行下一步操作,会先将线程等待
            actions[i].Invoke();
            if(permissions[i])
            {
                ++i;
            }
            yield return new WaitForEndOfFrame();
        }
    }

}
posted @   shenlei_blog  阅读(474)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示