Android6.0的动态权限封装

现有还是如果了解我们的6.0的动态权限我在简书上有以篇有过简绍;

我们这样我们就可以来现现我们的我们的 6.0的动态权限的封装我们可以继承我们的BaseActivity的基类,在基类中我们的可以做逻辑操作。

一 、我们可以把我们的权限放在一个类中我们,如果要使用我们就调用类中的常量就可以使用了

public class Constants {

    public static final int CALL_PHONE = 14;
    public static final int WEITE_EXTERNAL_STORAGE= 28;
    
}


二、我们在MainActivity的类要extends BaseActivity ,那我们就要写一个我们要使用到的这个类创建出来。

1.为子类提供一个权限检查的方法

2.String... Permission 表示不定参数,,也就是调用者放发的时候我们可以传入多个String的对象这是(JDK5的新特性)

 public boolean hasPermission (String... permission){
        for(String permissi : permission){
            if(ContextCompat.checkSelfPermission(this,permissi)!= PackageManager.PERMISSION_GRANTED){
                return true;
            }
        }
        return false;
    }

3.为子类提供一个权限申请的方法

 public void request(int code , String... persissions){
        ActivityCompat.requestPermissions(this,persissions,code);
    }


4.集中处理请求权限回调的业务逻辑

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            //打电话权限的回调处理
            case Constants.CALL_PHONE:
                //判断打电话申请权限是否成功,成功就执行打电话的逻辑
                //注意:因为集合里只有一个权限申请,所以参数为0代表打电话权限
                if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
                    docallphone();
                }else{
                    //用户拒绝就提示
                    Toast.makeText(this,"权限没有授予",Toast.LENGTH_LONG).show();
                }
                break;
        //SD卡权限的回调处理
            case Constants.WEITE_EXTERNAL_STORAGE:
                //判断打电话申请权限是否成功,成功就执行打电话的逻辑
                //注意:因为集合里只有一个权限申请,所以参数为0代表打电话权限
                if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    dosdcardPermission();
                }else {
                    Toast.makeText(this,"权限,没有授予",Toast.LENGTH_LONG).show();
                }
                break;
                default:
                    break;
        }
    }

5.

暴露给子类实现打电话业务逻辑的方法,子类如果有此功能,覆写此方法即可,不用再管权限的配置
子类没有此功能,就不用管此方法

/**
     * 暴露给子类实现打电话业务逻辑的方法,子类如果有此功能,覆写此方法即可,不用再管权限的配置
     * 子类没有此功能,就不用管此方法
     */
    public void docallphone(){};
    /**
     * 暴露给子类实现往SD写入数据业务逻辑的方法,子类如果有此功能,覆写此方法即可,不用再管权限的配置
     * 子类没有此功能,就不用管此方法
     */
    public void dosdcardPermission(){};

6. 回到MainActivity中我们就开始实现子类的权限的方法

hasPermission :是我BaseActivitiy 的提供权限检查的方法(参数就是我们在清单文件的权限)

返回为true 可以请求动态权限。返回为flase 就要授予

private void callphone() {
        if(hasPermission(Manifest.permission.CALL_PHONE)){
            request(Constants.CALL_PHONE,Manifest.permission.CALL_PHONE);
        }else{
            docallphone();
        }
    }


7.拨打电话的方法 

 @SuppressLint("MissingPermission")
    public void docallphone(){
        //执行打电话到10086的操作
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri parse = Uri.parse("tel:" + "1008611");
        intent.setData(parse);
        //使用AS,这里会报红,编译能通过,只是提醒你要做Android6.0权限的适配
        startActivity(intent);
    }




















猜你喜欢

转载自blog.csdn.net/w2316/article/details/78898509