android 6.0 运行时权限在activity和fragment的动态获取
工作中肯定会遇到权限的问题,当时上网查帖子 解决了问题之后,没再看,就这两天不太忙,写个博客记录下来,温习一下,加深一下记忆,也方便以后查看
今天用电话权限为例子
首先要在配置清单中给电话权限
在activity 中检查权限并且 申请权限
在我们需要申请权限的Activity中检查是否拥有权限
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
Log.w("tag", "没有权限");
//这里是没有权限的 需要动态申请权限 然后在回调方法中获取申请结果
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
shouldShowRequestPermissionRationale这个方法的名称叫 应该显示请求许可的理由吗?
//就是是用户点过禁止权限没有,没有放回false 点了返回ture 选了不在提醒那个 √ 一直返回 false
// 小米手机 点一次拒绝 一直返回的false if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CALL_PHONE)) {
Log.w("tag", "我再次申请");
//这里返回 ture 说明 用户禁止了权限 但是没有点击不再提醒 我们可以再次申请权限,并且说明我们为什么需要这个权限
} else {
Log.w("tag", "你点了不在提醒");
//这里是一般我们弹出dialog 提示权限禁止,是否手动开启权限,然后跳往设置界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
} else {
Log.w("tag", "有权限 打电话");
//else 证明我们已经有权限了 直接进行我们想要打电话的操作
callPhone();
}
//这里是动态申请权限的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 1) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.w("tag", "同意了权限");
//这里是动态申请权限,用户同意了权限 继续我们的打电话操作
callPhone();
} else {
//这里是动态申请权限,用户拒绝了我们的申请
Log.w("tag", "禁止了权限");
}
}
}
在fragment中申请权限
在fragment中申请权限 和activity 中有一点小小的不同
activity 中的申请方法
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
fragment中的申请方法
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1);
fragment中申请权限不能使用activity中的requestPermissions 的方法,直接使用fragment中的方法,否则fragment中不会触发回调方法,而是触发activity的回调方法,要直接使用fragment的申请方法
//回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//使用activity的requestPermissions 不会在fragment中回调 在activity中回调
// 直接使用fragment requestPermissions方法就可以
}
//简单的动态获取权限到这就结束了。有什么不对的地方欢迎指正