Android M的运行时权限中,如何区分从未请求和停止请求?

67
当涉及到M开发者预览运行时权限时,根据Google的说法:
  1. 如果您以前从未请求过某个权限,请直接请求该权限。
  2. 如果您之前已经请求过,并且用户拒绝了请求,而用户现在尝试执行需要被拒绝的权限的操作,则应提示用户解释为什么需要该权限,然后再次请求该权限。
  3. 如果您之前请求了几次,并且用户已经说“不要再问了”(通过运行时权限对话框上的复选框),则应停止打扰(例如,禁用需要该权限的UI)。
然而,我们只有一个方法shouldShowRequestPermissionRationale(),返回一个boolean,而我们有三种状态。我们需要一种方法来区分从未请求的状态和停止请求的状态,因为我们从shouldShowRequestPermissionRationale()中获得false

对于应用程序首次运行时请求权限,这不是一个大问题。有很多方法可以确定这可能是您的应用程序的第一次运行(例如,在SharedPreferences中的boolean值),因此,如果这是您的应用程序的第一次运行,则认为您处于从未询问的状态。

然而,运行时权限的愿景之一是您可能不会一开始就请求所有权限。与边缘功能相关的权限可能只在以后才会请求,当用户点击需要该权限的内容时才会请求。在这种情况下,应用程序可能已经运行了很多次,几个月之久,然后我们突然需要请求另一个权限。

在这些情况下,我们应该跟踪我们是否自己请求了权限吗?还是我错过了Android M API中告诉我们先前是否请求过的某些东西?


这是我所掌握的所有信息,与您刚刚发布的信息相同 https://plus.google.com/+BenjaminWeiss/posts/PFSd7wau4n8 - MLProgrammer-CiM
这个示例应用程序非常微不足道和不完整,它几乎不存在。 - MLProgrammer-CiM
最好的猜测是为每个权限在SharedPreferences或任何类似的工件中存储一个布尔值,这是Google在IO上的建议。 - MLProgrammer-CiM
2
我的担忧是SharedPreferences可能与Android自身存储的权限信息不同步。在运行时权限方面,Android是“记录系统”。它显然拥有这些信息,否则它将无法从shouldShowRequestPermissionRationale()返回true。我只是想看看是否有一些我错过的方法被添加了。 - CommonsWare
了解 Google,他们会在 6.1 中废弃 shouldShowRequestPermissionRationale() 并添加一个返回 int 值的新方法。 - Kevin Krumwiede
@KevinKrumwiede 没有发生 :( - Faustino Gagneten
11个回答

-3

没有必要为权限状态创建并行持久状态,您可以使用此方法,在任何时候返回当前的权限状态:

@Retention(RetentionPolicy.SOURCE)
    @IntDef({GRANTED, DENIED, BLOCKED})
    public @interface PermissionStatus {}

    public static final int GRANTED = 0;
    public static final int DENIED = 1;
    public static final int BLOCKED = 2;

    @PermissionStatus 
    public static int getPermissionStatus(Activity activity, String androidPermissionName) {
        if(ContextCompat.checkSelfPermission(activity, androidPermissionName) != PackageManager.PERMISSION_GRANTED) {
            if(!ActivityCompat.shouldShowRequestPermissionRationale(activity, androidPermissionName)){
                return BLOCKED;
            }
            return DENIED;
        }
        return GRANTED;
    }

注意事项:在sdk 23及以上的设备上,在用户通过用户提示接受/拒绝权限之前,返回将阻止第一个应用程序启动。

我也在这里使用了这个答案。


1
这将在第一次使用情况下失败,如果您从未向用户请求过权限,则您的方法getPermissionStatus将错误地返回“BLOCKED”,这实际上是不正确的。在这种设计中需要第四个状态,可能称为“HAVENT_ASKED”,唯一检测它的方法是通过使用共享首选项或类似的东西。 - Apoorv Khatreja
true,对于某些用例仍然可能有用;我只是真的不喜欢使用共享首选项来跟踪并行状态。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接