Android运行时权限中永远不会显示“不再询问”复选框

Posted

技术标签:

【中文标题】Android运行时权限中永远不会显示“不再询问”复选框【英文标题】:"Never ask again" checkbox is never shown in Android runtime permission 【发布时间】:2016-03-19 03:40:24 【问题描述】:

我的手机是 Nexus6,23 级。

我的应用中的目标 sdk 版本是 22。

我在支持包中通过 Fragment 在 BaseFragment 中实现棉花糖运行时权限兼容功能。

根据sdk文档,在第一次被拒绝后,“不再询问”复选框将显示在权限对话框中。同时, shouldShowRequestPermissionRationale() 将返回 true。

但是,无论我拒绝多少次权限,我都无法在权限对话框中看到“不再询问”复选框,并且 shouldShowRequestPermissionRationale 始终返回 false。

有什么问题吗?

【问题讨论】:

【参考方案1】:

你是否在被拒绝后再次调用 requestPermissions() ? 当您在第一次被拒绝后再次调用 requestPermissions() 时,将显示“不再询问”复选框。

像这样:

private void checkPermission()
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
        if(checkSelfPermission(Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED)
            requestPermissions(new String[]Manifest.permission.GET_ACCOUNTS, PERMISSION_REQUEST);
        
    



@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
        case PERMISSION_REQUEST:
            checkPermission();
            break;
    

【讨论】:

【参考方案2】:

有什么问题吗?

是的,就在这里:“我的应用程序中的目标 sdk 版本是 22。”

您的选择是:

    使用23或更高的targetSdkVersion,并实现运行时权限代码(checkSelfPermission()requestPermissions()等)

    使用 22 或更低的 targetSdkVersion,并且实现运行时权限代码(checkSelfPermission()requestPermissions() 等)

您组合的预期结果(targetSdkVersion of 22 并尝试使用运行时权限代码)是未记录的 AFAIK。

【讨论】:

以上是关于Android运行时权限中永远不会显示“不再询问”复选框的主要内容,如果未能解决你的问题,请参考以下文章

如何忘记 Android M 运行时权限对话框中的“不再询问”选项

对话框“不再询问”的 Android M 权限问题

当用户选择“不再询问”并禁用地理定位时,React native `Geolocation.getCurrentPosition` 承诺将永远不会被解决/拒绝

在请求运行时权限时选中“不再询问”框是不是会禁用未来的对话框?

如何在 Flutter 中请求和检查权限

Android 应用开发动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )