添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

目标:实现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、首先在unity项目中Plugins文件夹下Android文件下的AndroidManifest.xml文件,添加需要授权的权限。 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
public void PermissionRequest() string str = UnityEngine.SystemInfo.deviceUniqueIdentifier; Permission.RequestUserPermission("android.permission.READ_PHONE_STATE"); m_text.text = "hello" + str + "aaa"; // 获取 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 中显示图片。
C# File.Copy 报错:IOException: Could not create file “...xxxxpath...“. File already exists. 绿叶白墙: File.Copy(temporaryFilePath, fileName,true); 在最后加个true就不用写删除了