unity+android权限--打开应用不弹权限,动态请求权限
因为笔者之前的游戏需要分享图片,会请求外部储存,第一次打开游戏就会出现弹窗:
很多人对这个很敏感,怕你访问到他们的照片隐私,看到这个权限就拒绝,甚至卸载,实际上我们只是想截屏游戏内容分享给其他玩家,但是赖不住人家不信啊.
如果我们实在想要分享图片或者需要这个权限,那么我们可以不让它在启动的时候弹出,而是点击分享的时候弹出权限(动态请求权限)
首先,屏蔽权限弹窗,AndroidManifest.xml里面加入
<!-- Unity打包屏蔽android权限弹窗--> <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
接下来是请求权限,在你需要的位置请求
unity端
//AndroidJavaClass是在UnityEngine命名空间里面的
using UnityEngine;
#if UNITY_ANDROID
AndroidJavaClass androidClass = new AndroidJavaClass("com.xxx.xxx.UnityPlayerActivity");//获取class,填写正确的Activity
androidClass.CallStatic("requestExternalStorage");//调用静态方法,requestExternalStorage这个函数名你可以自己取,记住是静态函数
#endif
java端,写在你的Activity里面
import android.support.v4.content.PermissionChecker; import android.support.v4.app.ActivityCompat; //前面说过了静态方法,android.permission.WRITE_EXTERNAL_STORAGE是外部存储权限,同理其他权限也可以动态请求 public static void requestExternalStorage() { //检查权限避免重复请求相同权限,参数:activity,权限名 if (PermissionChecker.checkSelfPermission(this, "android.permission.WRITE_EXTERNAL_STORAGE") != 0) { ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 100);//请求权限,参数:activity,权限名,请求码(不同的权限要求不同的请求码,可以自己定,比如我这个权限是100,另外的可以填102,103...) } }
这样就可以避免打开应用出现权限弹窗了,在对应的位置动态请求权限
但是,如果动态请求权限的时候,玩家拒绝了,咋办
//如果玩家拒绝授权,需要再次申请并说明申请理由 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(100 != requestCode)return;//我们刚才定义的请求码是100
//给个弹窗告知玩家这个权限不会对他造成影响
if (ActivityCompat.shouldShowRequestPermissionRationale("这个权限不会访问隐私,求求你开一下嘛", "android.permission.WRITE_EXTERNAL_STORAGE")) {
(new Builder(this)).setMessage(string.storage_permissions_remind)
.setPositiveButton("OK", new OnClickListener() {
public void onClick(DialogInterface var1, int var2) {
//点击ok,则再次请求
requestExternalStorage();
}
}).setNegativeButton("Cancel", new OnClickListener() {
public void onClick(DialogInterface var1, int var2) {
//点击cancel,todo
}
}).create().show();
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)