在针对API 26的应用程序安装过程中获取所有权限

4
在 Android API 版本22及之前,系统会在安装时获取所有权限。从API 23(Marshmallow)开始,系统在运行时(应用程序实际尝试使用功能时)要求权限。出于某些原因,这并不适合所有情况。
以下是一些问题:
- 开发者必须经常编写两个不同的代码流程(一个是用户授权,另一个是用户拒绝)。 - 在请求权限时,Android 可以完全控制显示在权限对话框上的文本,并要求用户按“是”或“否”。有时,权限对话框中显示的文本不合适。 - 如果我们请求多个权限中的一个权限被拒绝,则由于 Android 代码错误,应用程序会崩溃。这是 API 23、24 和 25 的问题。我认为它在 26 中已修复。
我们应用遇到的问题有:
- 例如:出于安全原因,我们想获取设备ID,但当我们请求权限时,Android 显示的消息类似于'Allow MyApp to manage phone calls'。我们与电话呼叫无关,这个消息不适合获取设备 ID。这导致用户在应用中注册和营销团队非常担心。 - 例如:我们有很多 web 视图,我们尽可能地使用离线存储和缓存来提供更好的用户体验,但是用户正在拒绝权限,因为 Android 权限对话框显示 'Allow MyApp to access storage files'。
那么问题是,是否有任何方法可以在应用程序安装时(如 API v22 及之前)获取所有权限,在新的API版本(23及以上)中而不是在运行时请求?

1
可以显示一个额外的对话框,向教育用户解释为什么需要这些权限。或者(在使用此类应用程序时,我感到不适),您可以将用户带到权限屏幕,并让他们启用所有权限。还有一种方式(我个人不安装这样的应用程序),就是针对22或更低版本的系统。 - Calvin
2个回答

3

当我们请求多个权限时,如果有一个权限被拒绝,应用程序会因为 Android 代码的 bug 而崩溃。

这是不正确的。您的应用程序必须能够处理这种情况。

在较新的 API 版本(23 及以上),是否有办法在应用程序安装过程中获取所有权限(类似于 API v22 及以前),而不是在运行时请求?

不,当您的应用程序目标 API > = 23 时,必须在运行时请求权限。

至于第一个示例,我建议您阅读官方应用权限最佳实践文档。它提供了一种有用的提示,可能会对您有所帮助。

至于第二个示例,您可以尽可能地解释应用程序需要权限的原因。您可以在此处阅读更多信息。


3
首先,请求运行时权限是最佳实践,以下是谷歌的解释。
在某些情况下,您可能希望帮助用户理解为什么您的应用需要某个权限。例如,如果用户启动了一款摄影应用程序,则用户可能不会感到惊讶,因为该应用程序要求使用相机权限,但是用户可能不理解为什么该应用需要访问用户的位置或联系人。在请求权限之前,您应该考虑向用户提供解释。请记住,您不希望通过过多的解释来使用户感到压抑,如果您提供过多的解释,用户可能会发现应用很烦人并将其删除。
您可以采取的一种方法是,仅在用户已经拒绝该权限请求时提供解释。如果用户继续尝试使用需要权限的功能,但一直拒绝该权限请求,这可能表明用户不理解为什么应用需要该权限才能提供该功能。在这种情况下,显示解释可能是一个好主意。
为了帮助找到用户可能需要解释的情况,Android提供了一个实用程序方法shouldShowRequestPermissionRationale()。如果应用程序先前请求过此权限并且用户拒绝了请求,则此方法返回true。
注意:如果用户以前拒绝了权限请求并选择了权限请求系统对话框中的不再询问选项,则此方法返回false。如果设备策略禁止应用程序具有该权限,该方法也会返回false。
因此,在您的情况下,如果您仔细阅读文档,可以在安装时间一次性请求所有权限。在您的build.gradle文件(App)中,将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
我赞同最佳实践和谷歌的解释。但现实是,当应用程序急需权限而用户拒绝时,我们不得不想办法处理这种情况,这是令人沮丧的。 - whoami
2
如果用户试图拒绝,为什么要强制他们呢? - phatnhse

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