关于android6.0版本问题,最直接的解决方案就是把targetSdkVersion最大只能设置为22。如果你不想这么做就需要按照goole官方给出的方法一步步的来。
首先你需要在AndroidManifest.xml文件中注册一下你要申请的权限;
接着就是按照goole API给出的方法:
先申请权限:
if (ContextCompat.checkSelfPermission(getApplicationContext(),
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
// 该方法是判断权限是否已经申请了,可以理解为AndroidManifest.xml文件中是否声明了该权限,并不是用户同意了该权限或拒绝了该权限,当用户一但使用到该权限,系统就会弹出对话框,询问用户是否允许或拒绝该权限。
}
注意强烈建议在你需要的用到权限的地方申请权限,虽然权限申请在何时申请都可以(必须在你使用到权限之前),但有时很遇到很多的坑。
然后发出请求权限:
// 如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
// 如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,
// 此方法将返回 false,并且如果设备规范禁止应用具有该权限,此方法也会返回 false。
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.READ_CONTACTS)) {
//在这里提醒用户你要使用权限意图
} else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.READ_CONTACTS}
, REQUEST_READ_CONTACT);//发起请求
}
最后复写方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (permissions.length > 0) {
switch (requestCode) {
case REQUEST_READ_CONTACT:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限被允许
} else {
// 权限被拒绝
Toast.makeText(MainActivity.this, "权限被拒绝!", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
按照上述代码即可完成android 6.0 动态权限申请,下面贴出完整代码片段:
if (ContextCompat.checkSelfPermission(getApplicationContext(),
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.READ_CONTACTS)) {
//在这里提醒用户你要使用权限意图
} else {
//请求权限
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.READ_CONTACTS}
, REQUEST_READ_CONTACT);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (permissions.length > 0) {
switch (requestCode) {
case REQUEST_READ_CONTACT:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限被允许
/*
* 小米手机添加
* int checkOp = 0;
* AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
* checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_WRITE_CONTACTS,
Process.myUid(), getPackageName());
* if(checkOp == AppOpsManager.MODE_IGNORED){
//在这里提醒用户你要使用权限意图
}
*/
} else {
// 权限被拒绝
Toast.makeText(MainActivity.this, "权限被拒绝!", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
上面的代码在小米6.0的系统上是有问题的,在手机第一次弹出对话框询问是否允许该权限,不管你是拒绝还是同意使用权限shouldShowRequestPermissionRationale()方法都是返回为false,所以当你拒绝了该权限,他还是返回false,这就和上面的说法就有点冲突,然而坑爹的时小米官方并没有对此做出更改,但有人给出了解决办法:
int checkOp = 0;
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_WRITE_CONTACTS,
Process.myUid(), getPackageName());
if(checkOp == AppOpsManager.MODE_IGNORED){
//在这里提醒用户你要使用权限意图
}
上面的代码主要是判断该操作是否能被允许,比如上述代码就是判断写入联系人的操作是否被允许,所以通过权限申请和验证操作是否被允许两个去判断小米手机是否允许了该权限。(其他手机可不用添加上述代码,加了也可以,多此一举)。
当用户拒绝了权限时我们可以弹出一个对话框去提醒用户去开启权限,如何跳转到权限管理设置页面呢,代码如下:
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
以上是个人见解,有错误,欢迎提出来,共同进步。