EasyPermission

  1. 一、简介
  2. 二、使用
    1. 1.添加插件
    2. 2.使用
    3. 3.特殊情况

一、简介

Android6.0提出敏感权限,这些权限需要用户给予授权后才能使用。
github
这里使用引入第三方库来解决这个问题:
EasyPermission
当然,这些库也有很多。

二、使用

github:https://link.jianshu.com/?t=https://github.com/googlesamples/easypermissions

1.添加插件

dependencies {
compile 'pub.devrel:easypermissions:1.0.0'
}

2.使用

public class MainActivity extends Activity {

String[] permissions = {
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
};

public static final int PERMISSION_REQUEST_CODR = 10000;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initPermission();
}

void initPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!EasyPermissions.hasPermissions(this, permissions)) {
EasyPermissions.requestPermissions(this, "需要获取该授权", PERMISSION_REQUEST_CODR, permissions);
}
}
}

...
}

这里添加了我们需要的4个危险权限,requestCode值,以及initPermission方法。

hasPermission(Context context, String… perms)
前者即是环境,后者为请求的权限数组。
可以判断我们数组中的权限是否都以通过用户授权,如果全部通过,则返回false;如果至少一个没有通过,则返回true。

requestPermissions(Activity/Fragment params1, String rationale, int requestCode, String… perms)
第二个参数为是否授权的提示语,requestCode为回调code值,而最后是需要添加的授权数组
这里即是我们开始添加授权的位置,

源码中可以看到,这里调用requestPermissions方法的时候,内部也调用了hasPermissions方法确认

...
private static void requestPermissions(@NonNull PermissionHelper helper, @NonNull String rationale, @StringRes int positiveButton, @StringRes int negativeButton, int requestCode, @NonNull String... perms) {
// Check for permissions before dispatching the request
if (hasPermissions(helper.getContext(), perms)) {
notifyAlreadyHasPermissions(helper.getHost(), requestCode, perms);
return;
}

// Request permissions
helper.requestPermissions(rationale, positiveButton, negativeButton, requestCode, perms);
}
...

在检测返回结果时,需要重写onRequestPermissionsResult方法以及实现EasyPermissions.PermissionCallbacks接口回调
public class MainActivity extends Activity implements EasyPermissions.PermissionCallbacks {

...
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}

@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {

}

@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {

}

}

可以看到在权限回调方法中添加了

onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults, Object… receivers)
前三个参数直接将重写的方法中添加即可,而最后一个则是我们的监听回调,也就是PermissionCallbacks。这里使用的…就认为可以有多个回调接口的实例。

onPermissionsGranted(int requestCode, List≷String> perms)
在申请同意后的总回调,先运行,前者为code值,后者为同意的所以权限

onPermissionsDenied(int requestCode, List≷String> perms)
在申请拒绝后的总回调,后运行,前者为code值,后者为拒绝的所以权限

3.特殊情况

如果用户选择不再询问,并且拒绝了该权限。

public class MainActivity extends Activity implements EasyPermissions.PermissionCallbacks {
...
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this)
.setTitle("权限已经被永久拒绝")
.setRationale("因此无法打开,请开启该权限")
.setRequestCode(PERMISSION_OPEN_CODR)//用于onActivityResult回调做其它对应相关的操作
.build()
.show();
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PERMISSION_OPEN_CODR) {
Log.e("----->", "到此继续");
}
}
}

这里需要判断是否存在被填写不在询问的权限,如果有,则时app跳转至授权位置,否则无法打开app页面

somePermissionPermanentlyDenied(Activity/Fragment context, List≷String> deniedPermissions)
检查拒绝权限列表中的至少一个权限是否已被永久拒绝(用户单击“不再询问”)。