Unity 2021 请求 Android 12 读取本地文件权限

目标

工具:

  • Unity 2021.2.14c1f1
  • Android 12 系统手机

目标:实现Unity打出来的Apk包能请求读写android手机本地文件权限

原理

在Android系统中,操作手机中不安全的数据时,需要配置相应的权限,只有经过用户许可才能使用,设置各种权限的原因在于保护用户隐私,那么当我们开发 unity 项目需要请求权限时,可以根据以下方式

  1. 基于 Unity 官方 API 实现申请 Android 权限,这样不需要在 Android 中写申请权限
  2. Unity 2019 起提供了 Permission 类申请 Android 权限,2021.3 版本 Unity 的API如下:
静态属性含义描述
Camera照相机在请求权限或检查是否已授予使用相机的权限时使用
CoarseLocation粗略的用户位置定位在请求权限或检查是否已授予以粗粒度使用用户位置的权限时使用
FineLocation精细的用户位置定位在请求权限或检查是否已授予高精度使用用户位置的权限时使用
ExternalStorageRead外部存储(如SD卡)读取在请求权限或检查是否已授予从外部存储(如 SD 卡)读取的权限时使用
ExternalStorageWrite外部存储(如SD卡)写入在请求权限或检查是否已授予写入外部存储(如 SD 卡)的权限时使用
Microphone麦克风等权限在请求权限或检查是否已授予使用话筒的权限时使用

unity 2021.3 官方文档 Permission 介绍


实现

1. 需要在 C# 代码中添加申请权限

using UnityEngine.Android;
...
#if UNITY_ANDROID
    //安卓平台要请求从外部设备读写权限,如果安装后通过了权限请求,则以后这个APP就不会弹出请求权限框
    //但若安装后请求多次权限,都不通过,则多次后就不会弹出请求权限框
    
    //请求从 (SD 卡等)外部存储读取的权限
    if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) {
        Permission.RequestUserPermission(Permission.ExternalStorageRead);
    }
    
    //请求 写入外部存储(如 SD 卡)的权限       
    if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) {
        Permission.RequestUserPermission(Permission.ExternalStorageWrite);
    }
#endif
...

这里只请求外部存储设备的读写权限,其他权限可以参考 Permission API 实现:
在这里插入图片描述

2. 需要在 manifest 文件中声明权限

unity 打 apk 时生成 manifest 文件模板可以手动配置:File > BuildSettings > PlayerSettings > Player > PublishingSettings,启用 CustomMainManifest,表示可以自定义 AndroidManifest.xml 文件

在这里插入图片描述
通过路径找到对应的 AndroidManifest.xml 文件:

在这里插入图片描述

在 application 标签上面添加所需要的安卓权限的声明:在这里插入图片描述

保存后,打APK包运行即可看到在运行到 C# 代码时,请求安卓权限

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中,可以使用 Android 的 API 来读取本地图片。下面是一个简单的代码示例: ```csharp using UnityEngine; using System.IO; public class LoadLocalImage : MonoBehaviour { public string imagePath; void Start() { // 获取 Android 的 Context 对象 AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity").Call<AndroidJavaObject>("getApplicationContext"); // 读取图片文件 string filePath = Path.Combine(Application.streamingAssetsPath, imagePath); AndroidJavaObject file = new AndroidJavaObject("java.io.File", filePath); // 创建 Bitmap 对象 AndroidJavaClass bitmapFactory = new AndroidJavaClass("android.graphics.BitmapFactory"); AndroidJavaObject bitmap = bitmapFactory.CallStatic<AndroidJavaObject>("decodeFile", file.Call<string>("getAbsolutePath")); // 将 Bitmap 转换为 Texture2D 对象 byte[] byteArray = bitmap.Call<byte[]>("getNinePatchChunk"); Texture2D texture = new Texture2D(1, 1); texture.LoadImage(byteArray); // 在 Unity 中显示图片 GetComponent<Renderer>().material.mainTexture = texture; } } ``` 上面的代码中,`imagePath` 是图片文件在 StreamingAssets 目录下的相对路径。在 Android 中,需要获取 Context 对象来操作文件系统。首先,创建一个 `AndroidJavaClass` 对象来获取 UnityPlayer 类,然后调用 `currentActivity` 方法获取当前 Activity 对象(即 UnityPlayerActivity),最后调用 `getApplicationContext` 方法获取 Context 对象。然后,使用 `java.io.File` 类读取图片文件。接着,使用 `android.graphics.BitmapFactory` 类创建 Bitmap 对象,并调用 `decodeFile` 方法解码图片文件。最后,将 Bitmap 转换为 Texture2D 对象,并在 Unity 中显示图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值