android6.0权限框架搭建

举例:拨打号码
1.Anroid6.0运行时权限处理

findViewById(R.id.btn_callPhone).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //1.1首先判断有没有这个权限
                //context   检查权限的字符串
                int isPermission = ContextCompat.checkSelfPermission
                        (MainActivity.this, Manifest.permission.CALL_PHONE);
                //返回值有两个,PERMISSION_GRANTED授予    PERMISSION_DENIED拒绝
                if (isPermission == PackageManager.PERMISSION_GRANTED) {
                    //1.2如果有这个权限直接拨打号码
                    callPhone();
                } else {
                    //如果没有就去申请权限
                    ActivityCompat.requestPermissions(MainActivity.this
                            ,new String[]{Manifest.permission.CALL_PHONE},CALL_PHONE_REQUEST_CODE);
                    //requestPermissions(new String[]{Manifest.permission.CALL_PHONE},CALL_PHONE_REQUEST_CODE);
                }
            }
        });

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==CALL_PHONE_REQUEST_CODE){
          if(grantResults.length>0&&grantResults!=null){
              if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
                  //授予了
                  callPhone();
              }else{
                  Toast.makeText(this, "您的权限没有开启", Toast.LENGTH_SHORT).show();
              }
          }
        }
    }

    private void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + 10086));
        startActivity(intent);
    }

2.搭建一套自己的权限处理框架:反射+注解的方法
权限成功后的注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionSucceed {
    public int requestCode();
}

权限帮助类:PermissionHelper


public class PermissionHelper {
    //1.传什么参数
    //1.1 Object Fragment,Activity  1.2 int 请求码  1.3 需要请求的权限 String[]
    private Object mObject;
    private int mRequestCode;
    private String[] mPermission;

    private PermissionHelper(Object object) {
        this.mObject = object;
    }

    //2.以什么方式传入参数
    //2.1直接传入参数的方式
    public static void requestPermission(Activity activity, int requestCode, String[] permission) {
        PermissionHelper.with(activity).requestCode(requestCode).requestPermission(permission)
                .request();
    }


    //2.2链式调用

    /**
     * Activity
     */
    public static PermissionHelper with(Activity activity) {
        return new PermissionHelper(activity);
    }

    /**
     * Fragment
     */
    public static PermissionHelper with(Fragment fragment) {
        return new PermissionHelper(fragment);
    }

    /**
     * 添加一个注册码
     */
    public PermissionHelper requestCode(int requestCode) {
        this.mRequestCode = requestCode;
        return this;
    }

    /**
     * 添加权限
     */
    public PermissionHelper requestPermission(String[] permission) {
        this.mPermission = permission;
        return this;
    }

    /**
     * 3.1真正判断和发起权限
     */
    public void request() {
        // 3.2首先判断当期版本是不是6.0以上
        if (!PermissionUtils.isOverMarshmallow()) {
            //3.3如果不是6.0以上,那么直接执行方法  反射获取执行方法
            //执行什么方法并不确定,只能采用注解的方式给方法打一个标记
            //然后通过反射去执行  注解+反射
            PermissionUtils.exectuteSucceedMethod(mObject, mRequestCode);
            return;
        }

        //3.3.1如果授予了,那么我们直接执行这个方法  反射获取执行方法
        List<String> deniedPermission = PermissionUtils.getDeniedPermission(mObject, mPermission);
        if (deniedPermission.size() == 0) {
            //代表全部已经被授予
            PermissionUtils.exectuteSucceedMethod(mObject, mRequestCode);
        } else {
            //3.3.2如果没有被授予,那么我们就申请权限
            ActivityCompat.requestPermissions(PermissionUtils.getActivity(mObject)
                    , deniedPermission.toArray(new String[deniedPermission.size()])
                    , mRequestCode);
        }


    }

    /**
     * 请求回掉处理
     */
    public static void requestPermissionResult(Object object
            , int requestCode, String[] permissions) {
        List<String> deniedPermission = PermissionUtils.getDeniedPermission(object, permissions);
        if (deniedPermission.size() == 0) {
            //全部已经被授予
            PermissionUtils.exectuteSucceedMethod(object, requestCode);
        }else {
            //你申请的权限中,有用户不同意的
            PermissionUtils.exectuteFailMethod(object,requestCode);

        }
    }
}

权限工具类

public class PermissionUtils {
    private PermissionUtils() {
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    /**
     * 判断是不是6.0以上的版本
     * Marshmallow棉花糖  6.0
     */
    public static boolean isOverMarshmallow() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
    }
    /**
     * 用户执行成功的方法
     */
    public static void exectuteSucceedMethod(Object reflectObjcet, int requestCode) {
        //获取class中所有的方法
        Method[] methods = reflectObjcet.getClass().getDeclaredMethods();
        //遍历我们打了标记的方法
        for (Method method : methods) {
            PermissionSucceed succeedMethod = method.getAnnotation(PermissionSucceed.class);
            if (succeedMethod != null) {
                int methodCode = succeedMethod.requestCode();
                //并且我们的请求码必须requestCode一样
                if (methodCode == requestCode) {
                    //反射执行该方法
                    exectuteMethod(reflectObjcet, method);
                }
            }
        }
    }

    /**
     * 反射执行该方法
     */
    private static void exectuteMethod(Object reflectObjcet, Method method) {
        try {
            //第一个参数传该方法属于哪个类,第二个参数是传参数
            method.setAccessible(true);
            method.invoke(reflectObjcet, new Object[]{});
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取没有授予过的权限
     */
    public static List<String> getDeniedPermission(Object object, String[] permission) {
        List<String> deniedPermissions = new ArrayList<>();
        for (String requestPermission : permission) {
            //把没有授予过的权限添加到集合中
           if(ContextCompat.checkSelfPermission(getActivity(object), requestPermission)
                   ==PackageManager.PERMISSION_DENIED){
               deniedPermissions.add(requestPermission);
           }

        }
        return deniedPermissions;

    }

    public static Activity getActivity(Object object) {
        if (object instanceof Activity) {
            return (Activity) object;
        }
        if (object instanceof Fragment) {
            return ((Fragment) object).getActivity();
        }
        return null;
    }

    /**
     * 用户执行失败的方法
     */
    public static void exectuteFailMethod(Object object, int requestCode) {
        //获取class中所有的方法
        Method[] methods = object.getClass().getDeclaredMethods();
        //遍历我们打了标记的方法
        for (Method method : methods) {
            PermissionFail failMethod = method.getAnnotation(PermissionFail.class);
            if (failMethod != null) {
                int methodCode = failMethod.requestCode();
                //并且我们的请求码必须requestCode一样
                if (methodCode == requestCode) {
                    //反射执行该失败方法
                    exectuteMethod(object, method);
                }
            }
        }
    }
}

请求失败注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionFail {
    public int requestCode();
}

使用

public class MainActivity extends AppCompatActivity {

    private static final int CALL_PHONE_REQUEST_CODE = 0X0011;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_callPhone).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              /*  //1.1首先判断有没有这个权限
                //context   检查权限的字符串
                int isPermission = ContextCompat.checkSelfPermission
                        (MainActivity.this, Manifest.permission.CALL_PHONE);
                //返回值有两个,PERMISSION_GRANTED授予    PERMISSION_DENIED拒绝
                if (isPermission == PackageManager.PERMISSION_GRANTED) {
                    //1.2如果有这个权限直接拨打号码
                    callPhone();
                } else {
                    //如果没有就去申请权限
                    ActivityCompat.requestPermissions(MainActivity.this
                            , new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE_REQUEST_CODE);
                    //requestPermissions(new String[]{Manifest.permission.CALL_PHONE},CALL_PHONE_REQUEST_CODE);
                }*/
                PermissionHelper.with(MainActivity.this).requestCode(CALL_PHONE_REQUEST_CODE)
                        .requestPermission(new String[]{Manifest.permission.CALL_PHONE})
                        .request();
            }
        });

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        /*if (requestCode == CALL_PHONE_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults != null) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //授予了
                    callPhone();
                } else {
                    Toast.makeText(this, "您的权限没有开启", Toast.LENGTH_SHORT).show();
                }
            }
        }*/
        PermissionHelper.requestPermissionResult(this, requestCode, permissions);
    }

    @PermissionSucceed(requestCode = CALL_PHONE_REQUEST_CODE)
    private void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + 10086));
        startActivity(intent);
    }

    @PermissionFail(requestCode = CALL_PHONE_REQUEST_CODE)
    private void callPhoneFail() {
        Toast.makeText(this, "您的权限没有开启", Toast.LENGTH_SHORT).show();
    }
}

附源码:https://gitee.com/yijia_cn/android6.0Permission.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值