首页 > 解决方案 > 在用户做出选择之前调用 onRequestPermissionsResult?

问题描述

在我的应用程序中,我正在请求 onCreate() 函数的权限,如下所示

if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_GRANTED)
            registerListener(context);
        else if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.ACTIVITY_RECOGNITION))
            new AlertDialog.Builder(context)
                    .setTitle("Permission required")
                    .setMessage("This permission is required to fetch the sensor data from your phone, denying it will cause the app to exit")
                    .setPositiveButton("Give permission", (dialog, which) -> ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_REQUEST_CODE))
                    .setNegativeButton("Deny", (dialog, which) -> ((Activity) context).finish())
                    .show();
        else
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_REQUEST_CODE);

这是 onRequestPermissionsResult 被覆盖的方法

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == presenter.ACTIVITY_REQUEST_CODE)
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                presenter.registerListener(this);
            else {
                Toast.makeText(this, "Permission denied, exiting", Toast.LENGTH_LONG).show();
                finish();
            }
    }

现在我面临的问题是我得到了正确的弹出窗口来询问权限,但是Permission denied, exiting在我做出选择之前我看到了 toast 消息 (),并且由于finish() 方法调用应用程序在我做出选择之前退出!

我不知道为什么会这样,任何帮助表示赞赏!

标签: javaandroid

解决方案


实际上onRequestPermissionsResult正如预期的那样被完美地调用。你必须在它的体内处理箱子。您的问题是在打开以做出任何选择Activity之前完成。dialog因此,只需尝试注释掉finish()里面的方法onRequestPermissionsResult。查看下面的代码以获得更好的清晰度。

    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == presenter.ACTIVITY_REQUEST_CODE)
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            presenter.registerListener(this);
        else {
            // if user denies permission then Dialog would be pop up. That's why I commented out both toast and finish() method below.
            // If user clicks deny on the dialog then only finish activity.
            //Toast.makeText(this, "Permission denied, exiting", Toast.LENGTH_LONG).show();
            //finish();
        }
}

在代码的以下部分处理用户拒绝案例:

.setNegativeButton("Deny", (dialog, which) -> {
                        // Put code here for user denial------
                        finish();
                    })

推荐阅读