最近在写一个app的时候,需要获取联系人,仔细想想他是一个危险权限,android 6.0需要动态申请,所以就写了.
早之前我对象写过,所以我就把他的挪过来了,但是发现他没有回调,而在他的项目里好使,这是为什么呢,没多想就用了第三方
easypermissions,首先先导入依赖implementation 'pub.devrel:easypermissions:2.0.0' ,然后检查权限requestCallPhonePermission();
/**
* 检查动态权限
*/
public void requestCallPhonePermission() {
if (!EasyPermissions.hasPermissions(getActivity(), Manifest.permission.READ_CONTACTS)) {
EasyPermissions.requestPermissions(this, "缺少联系人的权限", 123, Manifest.permission.READ_CONTACTS);
} else {
//允许权限
readContacts();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
readContacts();
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(getActivity(), perms)) {
new AlertDialog.Builder(getActivity())
.setTitle("权限提示")
.setMessage("本项认证需要联系人权限,点击确认后在新页面滑动到最下方,在权限管理处,开启联系人权限")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getActivity().finish();
}
})
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到APP设置页面
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 111);
}
})
.create().show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 111) {
//用户从设置页面返回,可以在这里检测用户是否打开了权限
Log.d("xxxxx", "on" + requestCode + ":");
readContacts();
}
}
这张办法也好使,唯一的缺陷就是在点击不再询问的时候,他没有获取到联系人.但是他走onActivityResult()这个方法了.所以我就问我对象,他跟我说他的那种方法得适配一下fragment,所以就给了我一个截图,
这张图的意思是在BaseActivity用 ActivityCompat.requestPermissions(getActivity(), permissions, 1); 在basefragment用requestPermissions(permissions, 1); 这样就兼容了,亲测有效.,结束,最后把封装的这个办法给大家复制一下.
/** * 权限组 */ private List<String> mPermissionList = new ArrayList<>(); /** * 获取权限成功 */ protected void permissionSuccess() { } private String permissionName;//权限名字 /** * 用于申请权限处理 * 子类复写 permissionSuccess * 用于权限申请成功回调 * permissionName 权限名字 * * @param permissions */ public void showPermission(String[] permissions, String permissionName) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mPermissionList.clear(); this.permissionName = permissionName; for (int i = 0; i < permissions.length; i++) { if (ContextCompat.checkSelfPermission(getActivity(), permissions[i]) != PackageManager.PERMISSION_GRANTED) { mPermissionList.add(permissions[i]); } } //未授予的权限为空,表示都授予了 if (mPermissionList.isEmpty()) { permissionSuccess(); } else { //请求权限方法 //将List转为数组 permissions = mPermissionList.toArray(new String[mPermissionList.size()]); requestPermissions(permissions, 1); // ActivityCompat.requestPermissions(getActivity(), permissions, 1); } } else { permissionSuccess(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(getActivity()).onActivityResult(requestCode, resultCode, data); if (requestCode == 123) { // ActivityCompat.requestPermissions(getActivity(), mPermissionList.toArray(new String[mPermissionList.size()]), 1); requestPermissions(mPermissionList.toArray(new String[mPermissionList.size()]), 1); } } //处理权限申请回调(写在Activity中) @Override public void onRequestPermissionsResult(int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { switch (requestCode) { case 1: { // 授权被允许 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { permissionSuccess(); } else { // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { new CustomDialog(getActivity(), "缺失权限!", "我们需要您授权" + permissionName + "权限!", "设置权限", "设置权限", 1, 4, new CustomDialog.DialogKnowListener() { @Override public void onDialogKnowListener() { //权限授予了 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { permissionSuccess(); } else { //请求权限方法 //将List转为数组 if (!shouldShowRequestPermissionRationale(permissions[0])) { // 跳转到应用设置界面 goToAppSetting(); } else { showPermission(mPermissionList.toArray(new String[mPermissionList.size()]), permissionName); } } } }, new CustomDialog.DialogListener() { @Override public void onDialogOkListener() { //权限授予了 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { permissionSuccess(); } else { //请求权限方法 //将List转为数组 if (!shouldShowRequestPermissionRationale(permissions[0])) { // 跳转到应用设置界面 goToAppSetting(); } else { showPermission(mPermissionList.toArray(new String[mPermissionList.size()]), permissionName); } } } @Override public void onDialogCancelListener() { //权限授予了 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { permissionSuccess(); } else { //请求权限方法 //将List转为数组 if (!shouldShowRequestPermissionRationale(permissions[0])) { // 跳转到应用设置界面 goToAppSetting(); } else { showPermission(mPermissionList.toArray(new String[mPermissionList.size()]), permissionName); } } } }).show(); } } return; } } } // 跳转到当前应用的设置界面 private void goToAppSetting() { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 123); }
调用的时候showPermission(new String[]{Manifest.permission.READ_CONTACTS}, "联系人"); 然后覆写
/** * 获取权限成功 */ protected void permissionSuccess() { readContacts();//在这操作具体的逻辑 }