android权限请求、运行时权限申请
有些运行时权限,要在代码执行前提前申请权限,例如要保存文件时要先申请存储权限,拍照时需要申请拍照权限。
但当第一次申请权限弹系统权限框时,手动禁止了权限授权,则后面再申请时就不弹系统权限弹框了,要另外单独处理权限弹框。
//---------------------------------------------------------------------------------
if (hasPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// 当前有权限,可以处理业务
} else if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)){
// 弹系统权限申请弹框
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
ActivityCompat.requestPermissions(activity, permissions,1);
return;
} else {
// 用户拒绝了权限,同时也禁止了再次询问
showTipsDialog();
return;
}
}
//---------------------------------------------------------------------------------
public static boolean hasPermission(Context context, String permission) {
// 判断当前是否有相关的权限
return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
}
//---------------------------------------------------------------------------------
/**
* 显示提示对话框
*/
private void showTipsDialog() {
new AlertDialog.Builder(this)
.setTitle("提示信息")
.setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
}).show();
}
//---------------------------------------------------------------------------------
/**
* 启动当前应用设置页面
*/
private void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
//---------------------------------------------------------------------------------