安卓6.0权限的点滴记录
安卓权限问题:
- 当android:targetSdkVersion属性值<23时,系统会认为APP还没有支持新的权限系统而不会异常退出
- 当android:targetSdkVersion属性值>=23时,如果APP在运行时没有获得相关的权限,将会异常退出。
申请权限步骤
1.申明该权限
在AndroidManifest中申明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
2.判断是否为安卓6.0以上系统
if (Build.VERSION.SDK_INT >= 23) {
requestPermission();
}
3.检查是否已经有该权限,如果没有则进行申请权限
private static final int Write_Permission = 100;
private void requestPermission() {
//1. 检测APP是否在manifest中声明了该权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//2.checkSelfPermission方法返回值不是PERMISSION_GRANTED,权限没有开启,请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Write_Permission);
}else{
//权限已经开启
}
}
4.接收申请成功或者失败回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == Write_Permission) {
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限被用户同意
} else {
//权限被用户拒绝
showDialog(this,"权限被禁止,无法使用此功能。是否开启该权限?(步骤:应用信息->权限)");
}
}
}
private void showDialog(Context context,String msgInfo) {
new AlertDialog.Builder(context)
.setTitle("温馨提示")
.setMessage(msgInfo)
.setNegativeButton("取消", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton("设置",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//前往应用详情界面
try {
Uri packUri = Uri.parse("package:"+getPackageName());
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,packUri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
} catch (Exception e) {
//跳转失败
}
dialog.dismiss();
}
}).create().show();
}
注意事项:
shouldShowRequestPermissionRationale()
- 为了帮助查找用户可能需要解释的情形,Android 提供了一个实用程序方法,即 shouldShowRequestPermissionRationale()。如果应用第一次请求此权限但用户拒绝了请求,此方法将返回 true。
- 如果用户第一次拒绝了权限请求,并在权限请求系统对话框中选择了“不再提醒”选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。
- 注:某些机型(例如使用miui系统的机型)在用户第一次拒绝权限申请时该方法会返回false并且在之后不会再弹出权限申请对话框,这主要是miui在底层修改了此方法