java - 如何*正确*请求权限?
问题描述
我正在开发一个需要 3 个启动权限的 Android 应用程序。我必须等到用户在对话框中做出响应,如果没有,应用程序崩溃,因为权限是强制性的。
请求这些权限的正确方法是什么?我编写了下面的代码,但是在响应第一个权限(拒绝或接受)时应用程序冻结。
这是我做的:
String[] perms = {"Manifest.permission.READ_PHONE_STATE", "Manifest.permission.ACCESS_COARSE_LOCATION","Manifest.permission.CALL_PHONE"};
int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE);
int result2 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION);
int result3 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CALL_PHONE);
if ((result1 == PackageManager.PERMISSION_GRANTED) && (result2 == PackageManager.PERMISSION_GRANTED) && (result3 == PackageManager.PERMISSION_GRANTED)) {
onPermissionGranted();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(perms, PERMISSION_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(this, perms, PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted();
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
Toast.makeText(MainActivity.this, R.string.permission_required, Toast.LENGTH_LONG).show();
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
解决方案
Thread#sleep
由于权限请求是异步的,因此无需使用或使用 while 循环进行阻塞。以下是您的活动应该如何流动:
首先,定义需要权限才能运行的逻辑:
private void onPermissionGranted() {
//code to execute
}
然后,在 中onCreate()
,检查您是否拥有这些权限。如果这样做,请执行您的代码。如果您不这样做,请请求许可:
if (ContextCompat.checkSelfPermission(this,/*permissions*/) == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted();
} else {
ActivityCompat.requestPermissions(this, /*permissions*/, /*request_code*/);
}
当权限状态更新时,它会调用 to onRequestPermissionsResult
。如果已授予权限,请在此处执行操作。否则,请执行其他操作(重新显示对话框或完成活动)。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case /*our request code from before*/: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onPermissionGranted();
} else {
Toast.makeText(this, "Permissions are required in order to run this app!", Toast.LENGTH_SHORT).show();
finish();
}
return;
}
}
}
推荐阅读
- php - Vb.Net 中是否有等效的 PHP crypt($string,$salt)?无法使用 $salt 找到/创建任何内容
- javascript - 如何使用 onkeydown(一旦按下)触发循环?
- sql - SQL Server:根据当前行中的值删除以前的行
- android - 当手机通过热点连接到 wifi 时,有没有办法检测互联网连接的变化?
- batch-file - 批处理文件删除没有特定单词的文件夹
- python - 如果在同一个正则表达式字符串中匹配多个条件,则 Python 正则表达式
- d3.js - 将缩放行为从 v3 更新到 v5
- ffmpeg - 在 RTSP 流的末尾使用 FFMPEG 搜索
- attributes - 在调色板中注册的组件上使用属性会导致 AV
- c# - 多个 Serilog 记录器