Unity2022中的android权限处理(Permissions) 动态权限,权限弹窗
注意事项: 1.因为新规等因素需要提前弹出游戏自己的权限描述界面 2.玩家连续多次拒绝权限的处理
在activity中设置屏蔽android权限弹窗,避免一点开应用各种权限无序弹出
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
<application
android:name="com.longtu.android.channels.Info.LTBase_Channels_Application"
android:allowBackup="true"
android:usesCleartextTraffic="true"
android:label="@string/app_name">
<activity android:name="com.longtugame.rjsdk.MainActivity"
android:configChanges="orientation|keyboard|keyboardHidden|screenLayout|screenSize"
android:allowEmbedded="@string/app_name"
android:exported = "true"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
</activity>
shouldShowRequestPermissionRationale的正确使用
//最好的方法是用游戏自己的win来做提示,点击确定以后在弹出手机权限申请提示
public static bool IsShowPermissionPopWin()
{
bool isShowWin = false;
//
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
var pp = new AndroidJavaClass("androidx.core.app.ActivityCompat");
//没有的权限直接字符串定义,最终调用的还是android方法
var pList=new List<string>();
pList.Add("android.permission.READ PHONE STATE");
pList.Add(UnityEngine.Android.Permission.ExternalStorageRead);
pList.Add(UnityEngine.Android.Permission.ExternalStorageWrite);
var isShow1 = pp.CallStatic<bool>("shouldShowRequestPermissionRationale", currentActivity,
pList[0]);
var isshow2 = pp.CallStatic<bool>("shouldShowRequestPermissionRationale", currentActivity,
pList[1]);
var isShow3 = pp.CallStatic<bool>("shouldShowRequestPermissionRationale", currentActivity,
pList[2]);
///Google的原意是:
//1,没有申请过权限,申请就是了,所以返回false;
//2,申请了用户拒绝了,那你就要提示用户了,所以返回true,
//3,用户选择了拒绝并且不再提示,那你也不要申请了,也不要提示用户了,所以返回false,114.已经允许了,不需要申请也不需要提示,所以返回false,
if (isShow1 || isshow2 | isShow3)
{
// if (
// !UnityEngine.Android.Permission.HasUserAuthorizedPermission(pList[0]) ||
// !UnityEngine.Android.Permission.HasUserAuthorizedPermission(pList[1]) ||
// !UnityEngine.Android.Permission.HasUserAuthorizedPermission(pList[2])
// )
// {
// UnityEngine.Android.Permission.RequestUserPermissions(pList.ToArray());
// }
isShowWin = true;
}
return isShowWin;
}
Android 中的权限介绍(扩展以及原理解析)
系统权限分为两类:正常权限和危险权限。
正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。
注意事项:
权限是分组的,同一组的权限申请其中一个,同组的权限就全部都申请了。
特殊权限组:
CALENDAR 日历 CAMERA 相机 CONTACTS 联系人 LOCATION 定位 MICROPHONE 麦克相关,比如录音 PHONE 手机状态 SENSORS 传感器 SMS 短信 STORAGE 存储权限
Android中的权限接口
import android.support.v4.content.PermissionChecker;
import android.support.v4.app.ActivityCompat;
//前面说过了静态方法,android.permission.WRITE_EXTERNAL_STORAGE是外部存储权限,同理其他权限也可以动态请求
public static void verifyPermissions() {
//检查权限避免重复请求相同权限,参数: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...)
}
}
|