Android - 单击按钮时未显示权限对话框

Posted

技术标签:

【中文标题】Android - 单击按钮时未显示权限对话框【英文标题】:Android - Permission Dialog not showing on button click 【发布时间】:2021-03-16 11:35:09 【问题描述】:

在我的应用程序中,我需要从存储请求写入和读取权限。由于我想向用户显示应用程序需要这些权限,因此我创建了一个包含一个按钮的 Activity,单击该按钮时应调用存储权限对话框。

但是,由于最近的 android 发生了变化,这不再起作用了。

有没有一种新的(干净的)方式来请求许可?我做错了什么吗?

我在 AndroidManifest.xml 中添加了uses-permission 行:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

这是Activity里面的代码:

class ActivityPermission : AppCompatActivity() 

    companion object 
        var PERMISSION_REQUEST_CODE = 12
    

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

        binding = ActivityPermissionBinding.inflate(layoutInflater)

        setContentView(R.layout.activity_permission)

        binding.btnPermission.setOnClickListener 
            ActivityCompat.requestPermissions(this, arrayOf(
                    android.Manifest.permission.READ_EXTERNAL_STORAGE,
                    android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    PERMISSION_REQUEST_CODE)
        
    

    override fun onRequestPermissionsResult(
            requestCode: Int,
            permissions: Array<out String>,
            grantResults: IntArray
    ) 
        if (requestCode == PERMISSION_REQUEST_CODE) 
            if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                Toast.makeText(this, getString(R.string.permissiongranted), Toast.LENGTH_SHORT).show();
                finish()
             else 
                Toast.makeText(this, getString(R.string.permissiondenied), Toast.LENGTH_SHORT).show();
            
        
    

【问题讨论】:

您在清单中有WRITE_EXTERNAL_STORAGE 权限吗?如果没有,则添加它。另外,如果您要问WRITE_EXTERNAL_STORAGE,则不必问READ_EXTERNAL_STORAGE,它会与 Write 一起出现。 @ADM 我刚刚更换了,但遗憾的是对话框仍然没有出现。我还收到一条警告说“在针对 Android 10+ 时不再提供写访问”。出于兼容性原因,我还是会保留它。 您在哪个 Android 版本上进行测试?请注意,“从 Android 11 开始,如果用户在您的应用在设备上安装的整个生命周期内多次点击“拒绝”以获得特定权限,并且您的应用再次请求该权限,则用户不会看到系统权限对话框. 用户的动作暗示“不要再问了。”“ @ADM 我确实在 Android 11 中测试该应用程序。我真的不知道这一点。然后我可能不得不改变我请求权限的方式...... 当您在onRequestPermissionsResult 中获得拒绝时,您应该能够通过调用ActivityCompat.shouldShowRequestPermissionRationale 来确定权限对话框是否被抑制(即“不再询问”是否有效)。如果发生这种情况,您可以例如尝试将用户引导至 Android 设置应用程序,他们可以在其中切换应用程序的权限。当然,只有在绝对必要的情况下才应该这样做,因为用户可能会认为这是您的应用程序烦人的唠叨。 【参考方案1】:

感谢大家帮助我了解有关 Android 权限的更多信息。

我决定改变我请求许可的方式。我决定不使用 Activity,而是使用 Fragment(“向用户显示一个教育 UI。在此 UI 中,描述为什么用户想要启用的功能需要特定权限。” - source | 感谢 cmets 中的 @Michael 指出)。

由于我现在使用的是 Fragment,所以我必须使用 requestPermissions(感谢 this reply)。这现在可以完美运行,没有任何问题。

事实证明,在尝试请求权限时,您需要进行一系列检查。您必须首先检查权限是否真的通过checkSelfPermission 启用,以便您可以轻松选择用户应该从哪里开始使用该应用程序。

【讨论】:

以上是关于Android - 单击按钮时未显示权限对话框的主要内容,如果未能解决你的问题,请参考以下文章

在Facebook对话框中单击关闭(交叉)按钮时未调用onCancel()方法

无法使用 Appium 在 Android 的权限对话框中单击允许按钮

单击弹出项目时未显示警报对话框。有啥解决办法吗?

在 Android 中单击 Facebook 登录按钮后未显示 Facebook 身份验证对话框

Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框

Android:单击相机中的图像并在对话框中显示图像