当前位置: 首页 > 知识库问答 >
问题:

在Android M的运行时权限中,我们如何区分从不询问和停止询问?

南宫建白
2023-03-14

当涉及到M Developer预览运行时权限时,根据Google:

>

  • 如果您以前从未请求过某个权限,就请求它

    如果您之前询问,而用户说“不”,然后用户尝试执行需要被拒绝的权限的操作,那么在再次请求权限之前,您应该提示用户解释您需要该权限的原因

    如果您以前问过几次,而用户已经说了“不,停止询问”(通过运行时权限对话框上的复选框),那么您应该停止麻烦(例如,禁用需要权限的UI)

    但是,我们只有一个方法ShouldShowRequestPermissionRationale(),返回一个Boolean,我们有三个状态。我们需要一种方法来区分never-asked状态和stop-asked状态,因为我们得到了falseshouldshowRequestPermissionRationale()

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

    但是,运行时权限的一部分愿景是,您可能不会预先要求所有这些权限。绑定到边缘特性的权限可能只在以后用户点击需要该权限的东西时才会要求。在这里,在我们突然需要请求另一个权限之前,这个应用程序可能已经运行了好几个月了。

    在这些情况下,我们是否应该跟踪我们自己是否请求了许可?或者,在Android M API中,是否有我所缺少的东西告诉我们,我们以前是否问过?

  • 共有1个答案

    亢建白
    2023-03-14

    根据当前示例:https://github.com/googlesamples/android-runtimepermissions/blob/master/application/src/main/java/com/example/android/system/runtimepermissions/mainactivity.java#L195

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
            int[] grantResults) {
        if (requestCode == REQUEST_CAMERA) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                doThing();
                //STORE FALSE IN SHAREDPREFERENCES
            } else {
                //STORE TRUE IN SHAREDPREFERENCES
            }
        }
    

    在SharedPreferences中存储一个布尔值,将键作为您的权限代码和值,如上文所示,以指示该首选项以前是否被拒绝。

    可悲的是,当应用程序运行时,您可能无法对照已被接受但后来又被拒绝的首选项进行检查。最终的规范是不可用的,但有可能您的应用程序要么重新启动,要么获得模拟值,直到下一次启动。

     类似资料:
    • 在我的应用程序中,我创建了一个类名untitility。在这个类名中,我从代码中获取read_external_storage的权限。但问题是,当我在应用程序上单击“拒绝”时,我找不到警报通知来再次设置“允许”。一开始我就有“不再问”的选项。一旦我点击它,对话框就会消失。现在运行应用程序后,如果我点击拒绝,我再也找不到对话框消息,使它再次允许。我如何修改我的代码,以显示这个消息每次。 我的另一个类

    • 在我的应用程序中,我已经创建了一个类名Ungic,在那里我拧READ_EXTERNAL_STORAGE权限的代码。但问题是,当我点击拒绝应用程序,我没有找到警报通知设置它允许再次。起初,我有“永远不要再问”的选择。现在运行应用程序后,如果我点击拒绝,我不能再找到对话框消息,使其再次允许。我如何修改我的代码来每次显示此消息。 我的实用课程是 我的另一个类在这里我称之为实用类是

    • 问题内容: 我从Linux Shell 连接到。我时不时地运行一个太大的查询。它可以打印,我已经知道这不是我的意思。我想停止查询。 击中(几次)会完全杀死并把我带回外壳,因此我必须重新连接。 是否可以在不杀死自己的情况下停止查询? 问题答案:

    • 问题内容: 如何以编程方式停止正在运行的mysql查询? 我面临的问题是查询是使用用户提供的数据构造的,并且偶尔可能需要很长时间才能执行(大型表15-3000万行)。我想为用户提供一个cancel- option,但不知道如何停止当前正在执行的mysql-query。 该应用程序是Java applet- servlet:用户在applet中指定条件,该条件将传递给servlet,在servlet

    • 我想知道“不再问一遍”复选框布尔标志存储在哪里,以及如何清除它的值?不一定是编程的,而是手动的-通过设置,命令或一些工具。尝试清除应用程序数据,卸载,卸载和清除,尝试手动切换权限来回,甚至尝试为模拟器设置一个更新的Marshmallow映像,但没有运气!

    • 问题内容: 我在oracle 10 B中运行查询具有数百万条记录,并且C上没有索引 第一次运行它大约需要30秒,第二次运行查询大约需要1秒。 显然,它正在缓存某些内容,并且我希望它停止该操作,每次我运行查询时我都希望它花费30秒-就像它第一次运行一样。 为了使问题易于阅读,我过分简化了我所遇到的问题。 谢谢 问题答案: 清除缓存以衡量性能是可能的,但是非常麻烦。 跟踪已达到的调优性能的一个很好的方