目标:实现Unity打出来的Apk包能请求读写android手机本地文件权限
在Android系统中,操作手机中不安全的数据时,需要配置相应的权限,只有经过用户许可才能使用,设置各种权限的原因在于保护用户隐私,那么当我们开发 unity 项目需要请求权限时,可以根据以下方式
Camera
CoarseLocation
FineLocation
ExternalStorageRead
ExternalStorageWrite
Microphone
unity 2021.3 官方文档 Permission 介绍
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就不用写删除了
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 实现:
这里只请求外部存储设备的读写权限,其他权限可以参考 Permission API 实现:
Permission
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就不用写删除了
unity 打 apk 时生成 manifest 文件模板可以手动配置:File > BuildSettings > PlayerSettings > Player > PublishingSettings,启用 CustomMainManifest,表示可以自定义 AndroidManifest.xml 文件
通过路径找到对应的 AndroidManifest.xml 文件:
在 application 标签上面添加所需要的安卓权限的声明:
保存后,打APK包运行即可看到在运行到 C# 代码时,请求安卓权限