Unity 在Unity端申请Android权限

这篇具有很好参考价值的文章主要介绍了Unity 在Unity端申请Android权限。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

前段时间还在职的时候,遇到这么一个问题:SDK首次调起相机接口进行拍照的时候,会调起2次相机。并在第2次拍照后闪退。
分析了一下,都是发生在首次获取权限时才会发生,拿到权限就不会了。并且2台会发生这种情况的Android版本都是13。猜测是SDK获取权限接口没有适配好android13,于是尝试先把TargetAPI降到Android 10. 如下图,不过还是会闪退。
unity 权限申请,Unity通用,unity,android,游戏引擎
然后想了另外的办法,既然SDK是在申请权限的时候闪退,那我这边先自己申请好权限后,再调SDK的接口,SDK因为已经有权限就不用申请。测试了一下,果然可行,解决了闪退问题。接下来讲下怎么在Unity端申请Android权限

二、操作步骤

申请安卓权限一般有2种方式:
方式一:通过Android原生Java/Kotlin代码申请;
方式二:通过UnityAPI进行申请,这种会更方便一点;
我们讲下方式二

2.1 Permission.RequestUserPermissions

  • Unity 提供了 Permission.RequestUserPermission(申请单个权限) 和 Permission.RequestUserPermissions(申请多个权限)来申请权限。
  • 示例代码如下
/*********************************************
   文件:Leran.cs
   作者:super41
   日期: 2023年7月05日14:05:49
   功能: 
**********************************************/



using System.Text;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;




public class Learn : MonoBehaviour
{

    //UI相关
    public Button btn;
    public Text txt;
    
    //申请相关
    private PermissionCallbacks m_PermissionCallbacks;
    private StringBuilder m_StringBuilder;
    private bool m_IsGetAllPermission;
   
    void Awake()
    {
        btn.onClick.AddListener(()=>{RequestPermissions();});
    }



    /// <summary>
    /// 申请单一权限
    /// </summary>
    private void RequestCameraPermission()
    {
        if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
        {
            Permission.RequestUserPermission(Permission.Camera);
        }
    }
        
    /// <summary>
    /// 申请多个权限
    /// </summary>
    private void RequestPermissions()
    {
        if (m_StringBuilder == null)
        {
            m_StringBuilder = new StringBuilder();
        }
        else
        {
            m_StringBuilder.Clear();
        }
        m_IsGetAllPermission = false;
        
        //申请回调
        m_PermissionCallbacks = new PermissionCallbacks();
        m_PermissionCallbacks.PermissionDenied += OnPermissionDenied;
        m_PermissionCallbacks.PermissionGranted += OnPermissionGranted;
        m_PermissionCallbacks.PermissionDeniedAndDontAskAgain += OnPermissionDeniedAndDontAskAgain;
        
        //申请权限组
        string[] permissions =
        {
            Permission.Camera,
            Permission.ExternalStorageRead,
            Permission.ExternalStorageWrite,
            // 添加其他权限
        };

        //执行申请多个权限
        Permission.RequestUserPermissions(permissions,m_PermissionCallbacks);

    }
    
    /// <summary>
    /// 申请权限被拒绝
    /// </summary>
    /// <param name="permission"></param>
    private void OnPermissionDenied(string permission)
    {
        Write($"OnPermissionDenied:{permission}");
    }
    
    
    /// <summary>
    /// 申请权限成功
    /// </summary>
    /// <param name="permission"></param>
    private void OnPermissionGranted(string permission)
    {
        Write($"OnPermissionGranted:{permission}");
        //检查权限是否全部通过
        if (Permission.HasUserAuthorizedPermission(Permission.Camera) &&
            Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) &&
            Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
        {
            
            //一次申请多个权限,比如申请2个。会依次弹窗进行申请,在全部交互完成后才开始回调接口。如若玩家全部同意。这里会回调2次
            //所以这里需要加个变量防止重复回调
            if (!m_IsGetAllPermission)
            {
                m_IsGetAllPermission = true;
                //在这里处理权限通过的逻辑
                //do something
                Debug.Log("权限申请通过");
            }
        }
    }
    
    /// <summary>
    /// 申请权限被拒绝,且不再询问
    /// </summary>
    /// <param name="permission"></param>
    private void OnPermissionDeniedAndDontAskAgain(string permission)
    {
        Write($"OnPermissionDeniedAndDontAskAgain:{permission}");
    }

    private void Write(string str)
    {
        m_StringBuilder.AppendLine(str);
        txt.text = m_StringBuilder.ToString();
        Debug.Log(m_StringBuilder.ToString());
    }
}

2.2 把权限添加到AndroidManifest.xml

我们知道动态申请的Android权限,是需要先定义到AndroidManifest.xml里面的;
我们需要在Assets\Plugins\Android\AndroidManifest.xml 添加我们的权限,Unity会自动合并所有的AndroidManifest;

2.2.1 获取 AndroidManifest 模板

如果你没有一个AndroidManifest模板,可以通过以下方法获得一个AndroidManifest模板

  • 勾选Publishing Settings里的Custom Mainfest
    unity 权限申请,Unity通用,unity,android,游戏引擎

2.2.2 添加权限定义

勾选后Unity会自动生成一个模板到Assets\Plugins\Android目录下,接着我们只需要追加我们需要的权限就好了
unity 权限申请,Unity通用,unity,android,游戏引擎

三、结语

通过以上步骤,就可以在Unity端完成申请andorid权限了;
有一点需要注意的是,比如同时申请多个权限。比如2个,那么会依次弹起1/2,2/2窗口进行申请。并在用户全部操作完后,才会回调接口;
若用户都点了同意,那么OnPermissionGranted会回调2次,需要注意防止多次回调。比如上面示例用了一个m_IsGetAllPermission变量来防止多次回调;
unity 权限申请,Unity通用,unity,android,游戏引擎文章来源地址https://www.toymoban.com/news/detail-618947.html

到了这里,关于Unity 在Unity端申请Android权限的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity游戏嵌入Android应用(融合为一个应用)

    嵌入项目的AndroidStudio版本和Unity版本 Unity2019 AndroidStudio2021 01 新建一个新的安卓项目 项目里新建一个button 实现button的点击事件进入游戏 unity导出android工程 导出的工程文件夹放入原生的安卓项目 放入如下代码 放入如下代码 放入如下代码 项目里添加UnityGameActivity.java 需要配置

    2023年04月08日
    浏览(34)
  • Android之动态申请权限

    Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在运行时根据用户的需要动态授予。 Android 6.0以下,在AndroidManifest.xml文件中注册权限即可。 Android 6.0及其以后,既

    2024年02月04日
    浏览(43)
  • Android动态申请权限

    一、在AndroidManifest清单文件中声明要开启的权限 二、代码中动态申请相关权限

    2024年02月06日
    浏览(39)
  • android11 申请所有文件访问权限

    Android 11 引入了强制执行分区存储的限制,导致应用默认不能访问外部文件。 针对以前涉及较多文件的操作,可采用申请所有文件访问权限的方式来解决这一问题,实现方式如下。 (虽然这样做安全性低,官方并不推荐这样,但确实最快适配原有应用程序的方式) 1. Android

    2024年02月04日
    浏览(43)
  • Android 开发中的权限申请

            我们都知道,从 Android 6.0 开始,部分危险权限在 xml 注册的同时,还需要动态申请。 1、需要动态申请的权限         需要动态申请的权限主要分为这 9 类,当然每类中可能不止一个权限,但只要动态申请一个就默认获取整个类别的权限。 2、申请单个权限   

    2024年02月09日
    浏览(53)
  • unity调试手机游戏(Android)【模拟器+真机】+设置运行时游戏横屏

    注:我使用的unity版本为2021.3.2f1c1 1、将平台调整为Android 点击“文件“ —— ”生成设置“ 在平台选择Android,点击右下方的切换平台 (如果没有下载Android平台包需要先下载,我的下载好后自动配置了SDK/JDK/NDK,在下载时可选。若没有选择下载SDK/NDK/JDK,需要自行配置) 检查

    2024年02月08日
    浏览(50)
  • Android11及以上 文件读写权限申请

    Android11 读写权限申请 Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件读写权限。项目中 build.gradle 的 targetSdkVersion = 29 ,会出现读写问题。 当 targetSdkVersion = 29,通过设置requestLegacyExternalStorage=“true”,还能解决。 当 targetSdkVersion = 30后,需要申请所有文件

    2023年04月10日
    浏览(55)
  • android 11后文件读写访问权限申请

    android 11后对文件读写访问权限管理 与 android 10又有了新的要求,导致在读写或者访问时出现error:java.io.FileNotFoundException: /storage/emulated/0/file_path open failed: EACCES (Permission denied),以下为android 11文件管理权限申请办法 回忆android 10 文件访问权限申请 step 1: AndroidManifest中添加权限申

    2024年02月05日
    浏览(44)
  • android 12 SD动态申请读写权限

    android 12不仅需要在AndroidManifest.xml申请读写权限也需要在代码中动态的申请 关于如何动态申请读写权限仅需要两步 在AndroidManifest.xml文件中申请读写权限 在代码的启动MainActivity中动态申请方法 下面是关于动态权限申请的Manifest.class类大家有兴趣可以去了解下

    2024年02月11日
    浏览(38)
  • Android 获取SIM卡号码权限申请

    在AndroidManifest.xml中添加如下权限 uses-permission android:name=\\\"android.permission.READ_PHONE_STATE\\\"/ 如果你只在清单文件中添加权限却没有在代码中获取权限,代码还是会报错的。 报错原因: android 6.0以上增加了动态获取权限api,需要动态获取手机的权限。弹出对话框询问用户,请求用户

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包