Android6.0动态权限申请封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Adonis044/article/details/82556963

一、正常情况下当我们申请动态权限时,需要以下三部的操作:

  1. 判断是否获得对应权限
  2. 有则执行逻辑;没有则需要去申请对应权限
  3. 申请完之后处理申请的结果

正常代码如下:

//1.判断是否获取了对应的权限
if(ContextCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE)
   ==PackageManager.PERMISSION_GRANTED){
    //如果获得了权限就可以执行逻辑
    download();
}else{
    //2.没有的话就需要去申请对应的权限
    ActivityCompat.requestPermissions(mContext,
           new String[{Manifest.permission.WRITE_EXTERNAL_STORAGE},0x01);
}

//3.响应权限的申请
public void onRequestPermissionsResult(int requestCode,String[] permissions,
                                       int[] grantResults){
    switch(requestCode){
        case 0x01:
            if(grantResults.length > 0 && grantResults[0]==
               PackageManager.PERMISSION_GRANTED){
                //用户授予了对应权限
                //执行业务逻辑
                download();
            }else{
                //用户拒绝了
                //给用户给予提示,表明不能完成正常功能
            }
            break;
    }

}

二、对运行时动态申请权限的封装:

按照上面我们归纳的三步骤进行封装:

注意在基类(BaseFragment和BaseActivity)中进行封装,结构清晰方便调用

2.1首先我们需要判断是否拥有对应的权限

    //判断是否拥有对应权限
    public boolean hasPermission(String... permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(getActivity(), permission)
                    != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        //权限都获取到的
        return true;
    }

这里我们传入一个不定长参数代表调用时传入的需要判断的权限,然后使用循环依次的判断是否有申请的权限,没有的话return false。如果都有就return true。

2.2对权限申请的封装

    //权限申请的封装
    public void requestPermission(int requestcode, String... permissions) {
        if (Build.VERSION.SDK_INT >= 23) {
            requestPermissions(permissions, requestcode);
        }
    }

这里我们在BaseFragment中进行封装,直接调用requestPermissions就行,然后传入请求码和申请的权限。

2.3对申请权限响应的封装

    @Override
    public void onRequestPermissionsResult(int requestCode,
    String[] permissions,int[] grantResults) {
        switch (requestCode){
            case 0x01:
                if (grantResults.length>0&&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //权限申请成功,准备执行业务逻辑
                    doSDCard();
                }
                break;
        }
    }

这里根据前面的请求码requestCode进行switch-case对应的判断,如果请求成功则执行逻辑。

这里为了后面上层代码调用的方便性和封装性,把逻辑操作提取出来,在下面实现空方法,然后上层调用的时候,再Override此方法,再具体实现即可。

    //读写SD卡业务逻辑,由具体的子类实现
    public void doSDCard() {

    }

三、使用我们的封装进行运行时权限的申请:

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.update_view:
                Log.i(TAG, "click update_view");
                if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                    //已经拥有此权限
                    checkVersion();
                }else {
                    //还没有此权限
                  requestPermission(WRITE_READ_EXTERNAL_CODE,WRITE_READ_EXTERNAL_PERMISSION);
                }
                break;
        }
    }

然后再在下面Override业务逻辑方法:

    @Override
    public void doSDCard() {
        //具体逻辑
        checkVersion();
    }

到这里就完成了我们对Android6.0动态权限申请的封装,其实还可以使用一些开源的库进行封装,这里下次我使用的时候,会进行总结。

猜你喜欢

转载自blog.csdn.net/Adonis044/article/details/82556963
今日推荐