【问题标题】:AlertDialogBox showing even though never called kotlin androidAlertDialogBox 显示,即使从未调用过 kotlin android
【发布时间】:2019-07-18 05:57:17
【问题描述】:

我正在制作一个安卓应用,并请求读取存储的权限。

这里是请求权限的代码:

private fun checkPermission():Boolean {
        return checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED
}

private fun toast(text: String){
    Toast.makeText(applicationContext, text, Toast.LENGTH_LONG).show()

}
private fun setupPermissions() {
    if (!checkPermission()) {
        var requestCode = 7
        requestPermissions(this, arrayOf(READ_EXTERNAL_STORAGE), requestCode)
        if (!checkPermission()) {
            toast("Permissions not granted")

            val builder = AlertDialog.Builder(this@MainActivity)
            builder.setTitle("Permissions were denied.")
            builder.setMessage("You must allow MyApp access to your files to continue.\n\nNote: If you clicked \"Don't ask again,\" you'll have to enable the permission in settings")
            builder.setPositiveButton("OK") { dialog, which ->
                setupPermissions()
            }
            builder.setNeutralButton("EXIT") { _, _ ->
                Toast.makeText(applicationContext, "You cancelled the dialog.", Toast.LENGTH_SHORT).show()
            }
            val dialog: AlertDialog = builder.create()
            dialog.show()
        }
        else{
            toast("Permissions granted")
        }
    }


}

问题是它请求权限,但你可以看到它下面的 AlertDialog 框,即使它不应该被调用:

Screenshot of app when it launches (上面写着“不要再问了”,因为我已经试过很多次了)

它似乎正在运行requestPermissions(this, arrayOf(READ_EXTERNAL_STORAGE), requestCode),并且无需等待用户选择允许或拒绝,它就会显示对话框。

为什么会这样?感谢任何帮助,因为我是 kotlin 的新手

【问题讨论】:

  • 那么您希望Dialog 何时出现?
  • 如果权限请求被拒绝,我希望它出现。
  • 因此,如果他们没有给予许可,您不希望它立即出现。您希望出现“权限”框。然后,如果他们在“权限”框中单击“拒绝”,您将创建 Dialog?对吗?
  • 是的,这正是我想要的。
  • 好的,你需要做的是取出你的代码来创建Dialog,并在用户点击DENY时运行该代码。为此,您必须在向他们展示权限框后检测他们是否已接受或授予权限。

标签: android kotlin android-permissions android-alertdialog


【解决方案1】:

Dialog立即出现的原因是你在请求权限后检查是否创建。

第二个if (!checkPermission()) 没有任何区别,因为权限更改不会立即发生。您可以尝试以下步骤:

  1. 删除代码以使您的Dialog 成为setUpPermissions()
  2. 复制并粘贴以下代码:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (!checkPermission()) {
            toast("Permissions not granted")
    
            val builder = AlertDialog.Builder(this@MainActivity)
            builder.setTitle("Permissions were denied.")
            builder.setMessage("You must allow MyApp access to your files to continue.\n\nNote: If you clicked \"Don't ask again,\" you'll have to enable the permission in settings")
            builder.setPositiveButton("OK") { dialog, which ->
                setupPermissions()
            }
            builder.setNeutralButton("EXIT") { _, _ ->
                Toast.makeText(applicationContext, "You cancelled the dialog.", Toast.LENGTH_SHORT).show()
            }
            val dialog: AlertDialog = builder.create()
            dialog.show()
        }
        else{
            toast("Permissions granted")
        }
    }
    

这应该做的是在requestPermission()的结果发生后,它应该检查权限。然后,如果它没有被授予,它将成为Dialog

让我知道这是否有效,或者您是否遇到任何错误,因为我没有亲自测试它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多