sdk对target适配之动态权限适配

作为一个app,target是固定的一个,不用担心是否使用动态权限。但是作为一个sdk可就不那么明朗了,sdk提供给开发者使用,开发者根据自己的应用选择target,sdk就要考虑适配和兼容,那么接下来这里就给出下适配23以上和以下的权限代码,使用反射就可以了,但是注意权限不要使用v4里面的ActivityCompat,因为你不知道开发者是否使用了v4包,也不知道v4包的版本不同对该类是否有影响,所以这里我选择使用Activity里面的现有的权限检查,Activity里面有权限检查也是在target为23的Activity里,因此做下版本判断即可,不然就反射不到喽~

检查权限和请求权限代码,使用Activity自身的方法

检查权限和请求权限的代码,Activity的此方法只在target>=23的时候有

//检查权限
activity.checkSelfPermission(permission);
//请求权限
activity.requestPermissions(permissions,requestCode);

检查权限方法反射

    public static int checkSelfPermission_self(Activity activity,String permission){
        Log.d(TAG," checkSelfPermission_self start ");
        if (Build.VERSION.SDK_INT > 22) {
            Class clazz = null;
            try {
//                activity.checkSelfPermission(permission);
//                clazz = Class.forName(activity.getClass().getCanonicalName());
                ClassLoader classLoader = activity.getClassLoader();
                clazz = classLoader.loadClass(activity.getClass().getCanonicalName());
                Log.d(TAG," clazz: "+clazz);
                Method checkSelfPermission = clazz.getMethod("checkSelfPermission",String.class);
                Log.d(TAG," method: "+checkSelfPermission);
                checkSelfPermission.setAccessible(true);
                Object result = checkSelfPermission.invoke(activity, permission);
                int code = (Integer) result;
                Log.d(TAG," code: "+code);
                return code;
            } catch (Exception e){
                e.printStackTrace();
                Log.d(TAG," ex: "+e.toString());
            }
        }
        return -999;
    }

请求权限方法反射

    public static void requestPermission_self(Activity activity,String[] permissions,int requestCode){
        Log.d(TAG," requestPermission_self satrt ");
        if (Build.VERSION.SDK_INT > 22) {
            Class clazz = null;
            try {
//               activity.requestPermissions(permissions,requestCode);
                 ClassLoader classLoader = activity.getClassLoader();
                 clazz = classLoader.loadClass(activity.getClass().getCanonicalName());
//                clazz = Class.forName(activity.getClass().getCanonicalName());
                Class[] cArg = new Class[2];
                cArg[0] = String[].class;
                cArg[1] = int.class;
                Method checkSelfPermission = clazz.getMethod("requestPermissions",cArg);
                Log.d(TAG," method: "+checkSelfPermission);
                checkSelfPermission.setAccessible(true);
                checkSelfPermission.invoke(activity, permissions,requestCode);
            } catch (Exception e){
                e.printStackTrace();
                Log.d(TAG," requestPermission_self eee: "+e.toString());
            }
        }
        Log.d(TAG," requestPermission_self end ");
    }
注意

这里没有权限回调,所以需要自己主动去查询,我在代码中使用的是轮询,如果有好的方法,评论里见哦~

猜你喜欢

转载自blog.csdn.net/fanwei4751/article/details/95599483