我正在浏览关于Android M中新权限模型的官方文档.它讨论了shouldShowRequestPermissionRationale()函数,如果应用程序之前请求过该权限,而用户拒绝了该请求,则返回true.如果用户过go 拒绝了权限请求,并 Select 了"不再询问"选项,则此方法返回false.

但是,我们如何区分以下两种情况呢?

case 1:应用程序没有权限,用户以前也没有被请求过权限.在这种情况下,shouldShowRequestPermissionRegulation()将返回false,因为这是我们第一次询问用户.

case 2:用户拒绝了权限并 Select 了"不再询问",在这种情况下,showldshowRequestPermissionRegulation()将返回false.

在 case 2中,我想将用户发送到应用程序的设置页面.如何区分这两种情况?

推荐答案

在M Preview 1之后,如果对话框显示为for the first time,则没有Never ask again复选框.

如果用户拒绝权限请求,权限对话框中会有一个Never ask again复选框"请求权限".

所以逻辑应该是这样的:

  1. 请求许可:

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
    } else {
        //Do the stuff that requires permission...
    }
    
  2. 判断许可是否在onRequestPermissionsResult分钟内被拒绝或授予.

    如果之前该权限被拒绝,这次权限对话框中将有一个Never ask again复选框.

    拨打shouldShowRequestPermissionRationale查看用户是否选中了Never ask again.shouldShowRequestPermissionRationale方法仅在用户 Select 的Never ask again或设备策略禁止应用拥有该权限时返回false:

    if (grantResults.length > 0){
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //Do the stuff that requires permission...
        }else if (grantResults[0] == PackageManager.PERMISSION_DENIED){
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                //Show permission explanation dialog...
            }else{
                //Never ask again selected, or device policy prohibits the app from having that permission.
                //So, disable that feature, or fall back to another situation...
            }
        }
    }
    

所以,你不必追踪用户是否勾选了Never ask again.

Android相关问答推荐

错误:无法解析Symbol@style/Theme. Androidstudio in AndroidManifest.html for Kotlin Android Development''

KMM项目生成错误-';在项目';中找不到测试类:共享';

在Jetpack Compose中,material 3 Textfield上的底部边框 colored颜色 是如何更改的?

添加可组合元素的列表?

如何从Android 12的来电中获取电话号码?

Jetpack Compose:带芯片的Textfield

插入视图模型时,dagger 未命中绑定错误

为什么我在 android 中使用 TabLayout 时无法启动我的 Activity?

expo 上的 socket.io 无法从 Android 连接

在本地通知中设置自定义声音

Android Jetpack Compose 电视焦点恢复

Jetpack Compose - 在屏幕外偏移绘制形状并使用非常大的尺寸

为什么@PrimaryKey val id: Int? = null 在创建 Room 实体时有效吗?

我该怎么做文本计时器

在compose中,为什么修改List元素的属性,LazyColumn不刷新

如何从日期 Select 器计算年龄?

Jetpack Compose:SpanStyle 的 TextAlign(垂直居中)

有人可以向我解释这两个结果有什么区别吗?

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?

我的自定义视图没有显示我应该如何修复它?