在目标API 26上安装应用期间获取所有权限

时间:2017-07-17 01:24:19

标签: android android-webview android-permissions android-security

在Android API 22及更早版本中,系统会在安装时获得所有权限。从API 23(Marshmallow)开始,系统在运行时(当应用程序实际尝试使用某个功能时)请求权限。由于某些原因,这不是很好。

  • 开发者必须写2个不同的(1 - 如果用户授予权限,2。 如果用户拒绝了权限)代码流始终。

  • 在请求权限时,Android可以完全控制显示要在权限对话框中显示的文本,并要求用户按是或否。有时,权限对话框中显示的文本不合适。

  • 当我们请求多个权限并且其中一个权限被拒绝时,应用因Android代码错误而崩溃。这是API 23,24和25的问题。我认为它已在26中修复。

我们的应用中遇到的问题,

示例1:出于安全原因,我们尝试获取设备ID,但在我们请求权限时,Android会显示“允许MyApp管理电话”等消息。我们与电话无关,该消息不适合访问设备ID。这会降低用户注册(注册)应用程序和营销团队非常担心。

示例2:我们有很多网页浏览量,我们尝试尽可能多地使用离线存储和缓存以获得更好的用户体验,但是用户拒绝了权限,因为Android权限对话框显示“允许MyApp到访问存储文件'。

所以,问题是,无论如何在新的API版本(23及更高版本)上获取应用程序安装过程中的所有权限(如API v22及更早版本),而不是在运行时请求? /强>

2 个答案:

答案 0 :(得分:3)

首先,请求权限运行时是最佳实践,这是Google的解释

  

在某些情况下,您可能希望帮助用户了解您的应用需要获得权限的原因。例如,如果用户启动了一个摄影应用程序,用户可能会对应用程序要求使用摄像头的许可感到惊讶,但用户可能不理解该应用程序为何需要访问用户的权限。位置或联系人。在您申请许可之前,您应该考虑向用户提供说明。请记住,您不希望用解释来压倒用户;如果您提供了太多解释,用户可能会发现应用程序令人沮丧并将其删除。

     

您可能使用的一种方法是仅在用户已拒绝该权限请求时提供说明。如果用户不断尝试使用需要权限的功能,但不断拒绝权限请求,则可能表明用户不理解应用程序为何需要提供该功能的权限。在这种情况下,显示解释可能是一个好主意。

     

为了帮助找到用户可能需要解释的情况,Android提供了一个实用方法,shouldShowRequestPermissionRationale()。如果应用先前已请求此权限且用户拒绝了该请求,则此方法返回true。

     
    

注意:如果用户过去拒绝了权限请求并在权限请求系统对话框中选择了“不再询问”选项,则此方法返回false。如果设备策略禁止应用程序拥有该权限,则该方法也会返回false。

  

因此,在您的情况下,如果您仔细阅读文档,您可以在安装时间中获得一次所有权限。在build.gradle文件(应用程序)中,将targetSdkVersion设置为低于23的api级别。例如:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "vn.yourpackage.name"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

}

答案 1 :(得分:2)

  

当我们请求多个权限以及其中一个权限时   被拒绝,应用程序因Android代码错误而崩溃。

事实并非如此。您的应用必须能够处理这种情况。

  

有没有办法在应用安装过程中获得所有权限   在较新的API版本(23和更高版本)上本身(如API v22和之前)   以上)而不是在运行期间请求?

不,当您的应用定位API> = 23时,您必须在运行时请求权限。

至于第一个例子,我建议你阅读官方的Best Practices for App Permissions文档。它建议useful tip可以帮助你。

关于第二个示例,您可以做的最好的事情是向用户解释应用程序需要权限的原因。您可以阅读更多here