使用此代码根本不显示请求权限对话框,为什么?

Requesting Permission dialogue not showing up at all with this code, why?

我试图在运行时单击某个按钮后向用户请求存储权限。但不知何故,无论我尝试什么,这段代码(包含在片段的 class 中)根本不起作用。

binding.button.setOnClickListener {
    requestPermissions(this.requireActivity(), "android.permission.WRITE_EXTERNAL_STORAGE", 392)
}

这段代码对于写入和读取权限均无效:

binding.button.setOnClickListener {
    ActivityCompat.requestPermissions(this.requireActivity(), "android.permission.WRITE_EXTERNAL_STORAGE", 392)
}

无论如何都不会出现对话。

注意:我正在 API 29 上的物理设备 运行 上进行测试。 注 2:我向清单添加了 WRITE 和 READ 权限。 注 3:执行任何 IO 任务都会使我的应用程序崩溃。

我在网上查了很多,但我还是不明白为什么它不起作用。

至于您检查权限的方式(如果它在片段中)可能不正确,因为这些方法已被弃用,您可以使用推荐的另一种方式

Documentation for how to request permissions|android developers

这样才是正确的方法:

第 1 步 - 您将此代码作为全局代码放入 fragment/activity:

private final ActivityResultLauncher<String> requestPermissionLauncher =
            registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
                if (isGranted) doSomething()
                else
                    Toast.makeText(getContext(), "Can't continue without the required permissions", Toast.LENGTH_LONG).show();
            });

第 2 步 - 然后,当您需要请求权限时,您在声明为 global 的对象上调用 launch ,它将在 Fragment / Activity 的 OnCreate() 函数中调用。所以如果您想在创建片段 / Activity 时询问这些权限,则只需将此代码放在 OnCreate() 中,或者如果使用按钮来检查权限,则在 onCreate() 函数中设置相同的 onClickListener:

public void getNecessaryPermissionsAnddoSomething() {
        if (ActivityCompat.checkSelfPermission(getContext(),
                Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
        } else doSomething();
    }