在此分步教程中了解有关添加多个运行时权限的信息
本文是“ 今天学到的知识”系列的一部分,最初发布在我的TIL Github存储库和我的网站wajahatkarim.com上
在我当前的工作项目中,我有一项任务是在代码非常陈旧且使用旧方法和框架/工具的android应用中添加运行时权限。通常,我在所有应用程序中都使用Ted Permissions作为运行时权限,并且我敢肯定的是,这是我见过的一个令人惊叹的库的地狱,并且鉴于Android中复杂的场景和运行时权限流(感谢Google始终确保使所有事情都变得比以往更加复杂),该库使运行时权限变得轻而易举。特德公园的工作很棒。
Android 在API级别23(Android Marshmallow 6.0)或更高版本中引入了运行时权限。权限的实现流程非常复杂,如下图所示:
图片来源:Ted Permissions
今天,当我正在寻找一种非常简单的方法来执行此操作时,我震惊地看到Google如何使这一简单的事情变得如此复杂和令人困惑,难以实现,就像他们对Camera API的实现一样。我花了整整一天的时间才在代码的开头添加两个简单的运行时权限。这是我的方法。
重要说明:您不应一次性的请求所有权限。相反,您应该仅在应该使用该许可时才请求相关许可。我在开始时请求所有的权限,因为我们的代码库非常古老和复杂。
我的应用需要存储和位置权限。因此,将这些权限添加到Android Manifest文件中,如下所示:
现在,应用程序启动后,它会同时请求(位置和存储)权限。如果两个权限都被授予,则该应用程序将正常执行常规功能。我们可以在第一个Activity的onCreate()方法中进行操作,如下所示:
请注意,在上面的代码中,我创建了一个String []数组,其中包含我们将在此处请求的所有权限。现在,让我们实现checkAndRequestPermissions()方法。
从上面的代码中可以看到,我们可以使用ContextCompat.checkSelfPermission()方法检查任何权限的状态。我们可以使用ActivityCompat.requestPermissions()方法请求任何权限。这些方法已包含在支持库中。
现在,如果listPermissionsNeeded不为空,则意味着至少一个或多个权限已被拒绝。因此,requestPermissions()方法将显示权限对话框,并将调用onRequestPermissionsResult()回调方法
现在,如果listPermissionsNeeded不是空的,这意味着至少有一个或多个权限被拒绝。因此,requestPermissions()方法将显示权限对话框,并调用onRequestPermissionsResult()回调方法
如果通过“不再询问”拒绝了任何许可,则只能从应用程序的设置中允许该许可。由于没有这些权限,我的应用程序无法运行,因此我将显示另一个对话框,该对话框将允许用户转到应用程序的“设置”屏幕并允许手动授予权限。
Android上的Chrome浏览器的权限屏幕
我们可以使用另一个方法ActivityCompat.shouldShowRequestPermissionRationale(context,Permission)来执行此操作,该方法保留“不再询问”的记录。如果此方法返回true,则表示Android将显示请求权限对话框。并且如果为false,则当用户选中“不再询问”时,Android将不会显示该对话框。因此,在这里您必须将用户重定向到“设置”->“权限”屏幕,以允许用户手动授予权限。
现在,让我们看一下onRequestPermissionsResult()方法中的代码。我也提出了一些意见,因此这应该是不言而喻的。
这是showDialog()方法。它仅用于创建AlertDialog。
我希望这对您的应用程序开发有所帮助,并解决了运行时权限问题。