最近公司准备用Unity做一个安卓端的文件管理器功能,文件管理器已经做完了。刚开始的时候想要申请一下所有文件权限,发现在Unity里面申请所有文件权限(android.permission.MANAGE_EXTERNAL_STORAGE)相对来说比较麻烦。所以准备写一下文章记录一下如何申请到所有文件权限的。
我的
Unity版本是2021.3.27f1c2
Android版本是2022.3.1
在网上找到一个安卓使用的比较方便的插件叫XXPermissions,申请权限的界面也封装好了的。仓库地址是: https://github.com/getActivity/XXPermissions
大家假如安卓功底够好的话,可以直接看这个仓库的readme。
第一步
创建一个空的activty工程
根据仓库的readme配置好相关文件
新建个java类
叫unitypermission,复制下面的代码进去
package com.demo.myapplication;
import android.app.Activity;
import android.util.Log;
import java.util.List;
public class unitypermission {
private String TAG = "PERMISSION";
private Activity _unityActivity;
Activity getActivity() {
if (null == _unityActivity) {
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
_unityActivity = activity;
} catch (ClassNotFoundException e) {
} catch (IllegalAccessException e) {
} catch (NoSuchFieldException e) {
}
}
return _unityActivity;
}
//调用XXpermission相关API
public void RequestPermission() {
com.hjq.permissions.XXPermissions.with(getActivity())
// 申请单个权限
.permission(com.hjq.permissions.Permission.MANAGE_EXTERNAL_STORAGE)
// 设置权限请求拦截器(局部设置)
//.interceptor(new PermissionInterceptor())
// 设置不触发错误检测机制(局部设置)
//.unchecked()
.request(new com.hjq.permissions.OnPermissionCallback() {
@Override
public void onGranted(List<String> permissions, boolean allGranted) {
if (!allGranted) {
return;
}
Log.i(TAG, "onGranted: 申请权限成功");
}
@Override
public void onDenied(List<String> permissions, boolean doNotAskAgain) {
if (doNotAskAgain) {
// 如果是被永久拒绝就跳转到应用权限系统设置页面
com.hjq.permissions.XXPermissions.startPermissionActivity(getActivity(), permissions);
} else {
// 处理权限被拒绝的情况
}
}
});
}
}
打开build.gradle
点击绿色的按钮打jar包出来,注意上图第二个红框,可能不同的AndroidStudio出来jar包的位置不一样。
复制jar包至Unity工程的Plugins/Android下
打开Unity的project settings,勾选以下几个地方
然后plugins下面会多出下面几个文件
依次修改以下文件为
写一个C#脚本,挂到场景任意地方,然后打包至安卓手机上运行。就能够申请所有文件权限了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
AndroidJavaObject androidJavaObject = new AndroidJavaObject("com.demo.myapplication.unitypermission");
androidJavaObject.Call("RequestPermission");
}
// Update is called once per frame
void Update()
{
}
}