首页 > 解决方案 > 在请求并授予权限后立即执行 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); 

返回无效。

标签: javaandroidandroid-studioandroid-intentandroid-permissions

解决方案


您应该覆盖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();
        }
    }
}

推荐阅读