一、正常情况下当我们申请动态权限时,需要以下三部的操作:
- 判断是否获得对应权限
- 有则执行逻辑;没有则需要去申请对应权限
- 申请完之后处理申请的结果
正常代码如下:
//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动态权限申请的封装,其实还可以使用一些开源的库进行封装,这里下次我使用的时候,会进行总结。