先说下这个权限请求库能够做到的事情:
1.能够直接在请求结果回调里得到哪些权限被授予,哪些权限被拒绝,本次请求的权限是否全部被授予。
2.能够容易的在基类里进行封装,对拒绝方法进行统一的处理。
3.耦合比较小,适合从低版本sdk升级到6.0的朋友。
直接先看下使用的方法吧:
/**
* 实现了PermissionRequestResultListener 请求结果监听器的类
* Created by z2wenfa on 2016/10/26.
*/
public class BaseActivity extends AppCompatActivity implements PermissionRequestResultListener {
private int tag = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PermissionRequest.registerBroadCast(this, this, tag);//注册请求结果监听
}
@Override
protected void onDestroy() {
super.onDestroy();
PermissionRequest.unRegisterBroadCast(tag);//反注册请求结果的监听
}
/**
*请求权限被授予时调用
* @param requestCode 请求码
* @param grantedPermissions 被授予的权限
* @param getAllRequestPermissions 这次请求的权限是否全部都获得了
*/
@Override
public void onGetGrantedPermission(int requestCode, ArrayList<PermissionEntity> grantedPermissions, boolean getAllRequestPermissions) {
showMsg("请求" + grantedPermissions.toString() + "权限成功。" + "请求的权限是否全部获得:" + getAllRequestPermissions);
Log.i("test3", "权限请求成功:" + grantedPermissions.toString() + ":" + getAllRequestPermissions);
}
/**
*请求权限被拒绝是调用
* @param requestCode 请求码
* @param deniedPermissions 被拒绝的权限
*/
@Override
public void onGetDeniedPermission(int requestCode, ArrayList<PermissionEntity> deniedPermissions) {
showMsg("请求" + deniedPermissions.toString() + "权限失败,请到设置→应用管理→权限中授予权限。");
Log.i("test3", "权限请求失败:" + deniedPermissions.toString());
}
/**
*需要告诉用户为什么申请时调用
* @param requestCode 请求码
* @param deniedPermissions 需要告知用户的权限
*/
@Override
public void onShouldShowRequestPermissionRationale(int requestCode, ArrayList<PermissionEntity> deniedPermissions) {
showMsg("程序需要获得" + deniedPermissions.toString() + "权限以正常使用功能。");
Log.i("test3", "未获得:" + deniedPermissions.toString());
}
}
这个是基类的代码主要就是对请求消息监听的注册反注册和对请求结果进行统一的处理。我们可以直接在基类中进行权限拒绝与通知用户为什么需要申请权限的代码编写,一般我们只需要关心成功时的回调方法。我们在获得被授予的权限同时还可以通过getAllRequestPermissions这个参数判断本次请求的权限是否全部被授予。Fragment也是类似的使用方式。
接下来在看权限的请求:
public class MainActivity extends BaseActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
PermissionRequest.requestPermissionInOnCreateMethod(this, 2015, Permissions.CAMERA, Permissions.LOCATION);//在界面还未显示前进行权限请求
}
private void initView() {
button = (Button) findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PermissionRequest.requestPermission(MainActivity.this, 2015, Permissions.CONTACTS, Permissions.SMS); //界面已经显示了进行权限的请求
}
});
}
权限请求一共三个参数,第一个Activity对象,第二个请求码,第三个是可变长参数请求的权限。不过需要注意的是权限请求分为了在界面加载完成前请求与加载完成后请求(新的版本可能融合成一个方法)。
个人觉得使用起来还是挺简单方便了。
Gradle的使用方法:
compile 'com.z2wenfa:PermissionRequester:1.0.0'
简单说下为什么写这个库:
虽然已经网上已经有了很多的第三方库,但是经过实际的使用发现,有些地方使用起来不是特别方便,进行封装也比较的麻烦,于是我便想着实现一个容易封装点,耦合比较小的库。
我拿hongyang的MPermission为例说一下自己在哪些地方使用起来不是很方便吧(因为我之前使用的就是这个库):
1.没有细分请求的权限中哪些权限请求被允许,哪些被拒绝:
这个库在请求多个权限后,根据请求的的权限是否全部都获得了来判断本次请求是否成功,这就导致我不能够根据请求结果灵活的进行判断接下来执行什么操作。
举个例子:开发一个拍照app,当我请求权限时,我可能会同时请求拍照权限与定位权限,定位权限用来保存图片的地址,这时拍照权限就是必须的,而定位权限即使没有获得也不应该让app不能进行拍照吧!
如果我们在自己在请求结束后再进行一次对请求的判断的话就太麻烦了,最好的就是直接分类好结果给我。
2.处理请求结果会出现代码冗余:
MPermission使用的是通过注解与请求码来判断获得请求结果调用哪个方法,然而库只会从当前请求的类中寻找调用方法,而不会到父类中去寻找,这样的话就很麻烦了,只要
这个Activity或者Fragment请求了权限,就必须在这个类里编写请求结果执行的回调方法,然而实际情况下请求失败的提示基本上都是差不多的,我们只需要告诉用户没有获得某某权限如果想要系统正常使用就要到设置的权限管理中给予权限,每次都要再写一个方法再加上注解,感觉有点冗余了。
稍微说下封装的思路吧:
之前我们在进行权限请求时都是通过在本Activity获得Fragment重写
onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults)
而我的想法是为何不能使用一个统一的Activity专门进行权限请求呢?于是每次进行权限请求都会跳到这个统一处理的Activity中。
有兴趣的可以看下代码:
GitHub地址:https://github.com/z2wenfa/PermissionRequester
参考博客:http://blog.csdn.net/lmj623565791/article/details/50709663