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;
// #if !UNITY_EDITOR && UNITY_ANDROID
 #if  UNITY_ANDROID
        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;
#endif
    }

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...)
        }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐