Android6.0动态申请权限
android6.0之后一些敏感的权限需要在清单文件中注册之外,还需要在代码中动态申请,这里以蓝牙权限为例,我们现在在代码中申请以下三个权限,“android.permission.BLUETOOTH_ADMIN”,“android.permission.BLUETOOTH”,“android.permission.ACCESS_COARSE_LOCATION”;
1.先定义一个字符串数组将我们要申请的权限全部存放在里面
String[] permissions = new String[]{
"android.permission.BLUETOOTH_ADMIN", "android.permission.BLUETOOTH"
, "android.permission.ACCESS_COARSE_LOCATION"};
2.检查手机是否包含这些权限
public boolean requestAll() {
for (String peimiss : permissions) {
if (ActivityCompat.checkSelfPermission(this, peimiss) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
返回false表示没有权限,返回true表示有权限,当没有权限时我们再申请权限
3.动态申请权限
if (Build.VERSION.SDK_INT >= 23 && !requestAll()) {
ActivityCompat.requestPermissions(this, permissions, 0);
}
完成上述三步后,在没有权限时就会弹出对话框提醒用户打开权限,如果还想监听用户点击对话框的监听,那么就要监听以下方法
4.重写onRequestPermissionsResult方法
//请求n个权限 permissions.length=n grantResults.length=n
//permissions[i]表示申请的权限字符串 grantResults[i]的值表示用户反馈的结果 0表示同意 -1表示不同意
//requestCode 的值表示和当时申请权限时的值一致
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
for (int i = 0; i < permissions.length; i++) {
Log.e("Test","permissions==" + i + " ==" + permissions[i]);
}
for (int i = 0; i < grantResults.length; i++) {
Log.e("Test","mygt grantResults==" + i + " ==" + grantResults[i]);
if (grantResults[i] == -1) {
//finish();用户不同意打开申请时结束APP
}
}
Log.e("Test","requestCode==" + requestCode + " ");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}