onRequestPermissionsResult()没有在片段中调用,尝试了我能找到的所有解决方案

时间:2018-04-03 17:08:08

标签: android android-fragments android-permissions

运行我的代码时,永远不会调用

onRequestPermissionsResult()。我的片段中有一个请求权限的方法:

void initiateGalleryUpload() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(getActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(READ_EXTERNAL_STORAGE)) {
                    new AlertDialog.Builder(getActivity())
                            .setMessage(getString(R.string.read_storage_permission_rationale))
                            .setPositiveButton("OK", (dialog, which) -> {
                                Timber.d("Requesting permissions for read external storage");
                                requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, 1);
                                dialog.dismiss();
                            })
                            .setNegativeButton("Cancel", null)
                            .create()
                            .show();
                } else {
                    requestPermissions(new String[]{READ_EXTERNAL_STORAGE},
                            1);
                }
            } else {
                controller.startGalleryPick();
            }
        }
        else {
            controller.startGalleryPick();
        }

同一片段中的另一个方法覆盖onRequestPermissionsResult:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    Timber.d("onRequestPermissionsResult: req code = " + " perm = " + permissions + " grant =" + grantResults);

    switch (requestCode) {
        // 1 = "Read external storage" allowed when gallery selected
        case 1: {
            if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) {
                Timber.d("Call controller.startGalleryPick()");
                controller.startGalleryPick();
            }
        }
        break;

我读过的常见错误但不适用于我的案例:

  • 未使用appcompatv4 requestPermissions - 我正在使用
  • 不会覆盖同一片段中的onRequestPermissionsResult - 我在同一片段中这样做
  • 未更新支持库 - 我们正在运行最新版本

权限对话框按预期显示,我可以选择"确定"。

非常感谢一些帮助,因为我已经通过十几个StackOverflow帖子无济于事。完整代码here,如果有人需要它。

1 个答案:

答案 0 :(得分:5)

在您的活动级onRequestPermissionsResult()中,处理活动发出的所有权限请求。

如果requestCode与活动请求的不匹配(例如,在default的{​​{1}}分支中),则链接到超类(switch)。如果您不这样做,那么对于片段发起的请求,这可能会阻止super.onRequestPermissionsResult(requestCode, permissions, grantResults);将结果路由到片段。