java - 在请求并授予权限后立即执行 ACTION_CALL 意图
问题描述
我正在制作一个应该在单击按钮后拨打号码的应用程序。我想要做的就是在第一个权限请求之后立即执行该操作。
//everything here is in an onClickListener
//number is already specified
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse(String.format("tel:%s", Uri.encode(number))));
if(ActivityCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
activity.startActivity(callIntent);
}
else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//if Api >= 23
if(activity.shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)){
//WHY THIS PERMISSION IS NEEDED
final String why_the_permission_is_needed = "why it is needed";
new AlertDialog.Builder(activity)
.setTitle("WHY THIS PERMISSION IS NEEDED")
.setMessage(why_the_permission_is_needed)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.create().show();
}
}
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CALL_PHONE}, DIAL_PERMISSION_REQUEST_CODE);
if(ActivityCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
activity.startActivity(callIntent);
}
}
发生的事情是之前
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CALL_PHONE}, DIAL_PERMISSION_REQUEST_CODE);
完成剩余代码
if(ActivityCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
activity.startActivity(callIntent);
}
会被执行。这意味着用户必须单击一次按钮才能获得许可,然后再单击一次才能实际执行意图,这是我不想要的。
还
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CALL_PHONE}, DIAL_PERMISSION_REQUEST_CODE);
返回无效。
解决方案
您应该覆盖onRequestPermissionsResult
您的活动并处理请求的权限结果。为了能够重新调用您的流程,请在函数中声明您的点击侦听器算法,并在结果准备好时调用它:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
performCall();
}
})
然后处理结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0) {
if (requestCode == DIAL_PERMISSION_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
performCall();
}
}
}
推荐阅读
- google-auth-library - 具有跨源隔离的 Google oAuth2 登录
- office365 - 从 Office 365 合规中心删除统一审核日志
- c++ - QML将窗口设置为另一个窗口,后面有对象
- jenkins - 空手道框架与 Jenkins 的集成
- git - 每次我在 VS Code 中运行 Dart。它显示了这一点。为什么?我该如何解决?
- ruby-on-rails - 使用 rake(在 Rails 中)从视图中生成静态 html?
- php - Slim Framework 4 getParsedBody 总是返回 null
- c# - 如何在.Net Core 中使用不同的第三方记录器记录到文件?第三方记录器可能会在应用程序启动时动态更改
- javascript - 如何使用 css 选择与其他 div 处于同一级别的嵌套 div?
- awk - 在 mac 中,sed 不会将换行符替换为逗号