在API > 23上安装应用时询问所有权限

4
自 Android M 以来,唯一请求权限的方法是在运行时进行,但 VK 客户端应用程序在所有 Android 版本上安装时都成功地请求了所有权限。下面是来自 Pixel 手机的屏幕截图。有人能告诉我这是怎么做到的吗?

enter image description here


我可能错了,但为了保持向后兼容性,“旧版”应用程序仍可以在安装时请求权限。只有针对更高版本的新应用程序必须在运行时执行此操作。 - ledwinder96
运行时代码对于新开发人员来说似乎有点奇怪... - gumuruh
3个回答

6

他们使用的targetSdkVersion低于23:

“如果设备运行的是Android 6.0(API级别23)或更高版本,并且应用程序的targetSdkVersion为23或更高版本,则应用程序在运行时向用户请求权限[...] 如果设备运行的是Android 5.1.1(API级别22)或更低版本,或者应用程序的targetSdkVersion为22或更低版本,则系统会在用户安装应用程序时请求用户授予权限”

https://developer.android.com/guide/topics/permissions/requesting.html


1
这个答案已经不再令人满意了,从2018年11月开始,Google Play将不再接受目标SDK版本低于26的APK。因此,以<23为目标的解决方案已不再可行。那么我们如何在targetSdkVersion> 23的情况下请求安装时的权限呢?让我猜猜,这是不可能的吗?谷歌在这里真的犯了一个巨大的错误。我们的应用程序不是面向商业终端用户,而是商业工具。我们不希望最终用户对应用程序权限有任何控制。 - JeneralJames
@JeneralJames 这部分“截至2018年11月,Google Play不会接受目标SdkVersion小于26的APK”并不完全正确,因为Google Play将不会接受发布新apk的目标sdk版本低于26或更新现有apk ...但是如果某人已经发布了apk,并且不再更新它,它仍然有效并可以在2018年11月之后运行。 - Alessio
@JeneralJames “我们不希望最终用户对应用程序权限拥有任何控制权” -> 幸运的是,在您的应用程序和我作为用户之间,存在操作系统/Android系统...当然,作为用户,但也是开发人员,我希望给予用户完全控制应用程序权限的能力,因为我希望她知道我在请求什么以及为什么这样做,这样她可以拒绝我(特别是你)如果似乎不合法...例如,计算器应用程序不需要读取我的电话号码,访问我的联系人,阅读我的Wi-Fi等。 - Alessio
1
@daneejela 另一方面,你可以这样做:定义一组对于应用程序最低限度工作是强制性的权限,以及另一组可选权限。然后在启动画面之后使用一个权限屏幕来询问所有权限,并且只有在至少满足强制性权限时,用户才能继续进行注册流程或应用程序的其余部分。在运行时询问可选权限,并且每当一个强制性权限被禁用时,提示相同的权限屏幕以再次收集它们。我已经实现了它,它的效果非常好,我保证这是处理Android权限的最佳方法。 - Alessio
1
@Alessio,谢谢你。按照你在第二条评论中所描述的方式实施非常有意义。已点赞。 - daneejela
显示剩余7条评论

3
似乎该应用程序未更新以符合API级别>= 23的要求。您可以根据目标API级别不同地请求权限进行管理。
如果设备运行Android 6.0(API级别23)或更高版本,并且应用程序的targetSdkVersion为23或更高版本,则应用程序会在运行时从用户请求权限。用户可以随时撤销权限,因此每次访问受权限保护的API时,应用程序都需要检查是否具有权限。有关在应用程序中请求权限的更多信息,请参见“使用系统权限培训指南”。
如果设备运行Android 5.1.1(API级别22)或更低版本,或者应用程序的targetSdkVersion为22或更低版本,则系统会在用户安装应用程序时要求用户授予权限。如果在更新后的应用程序版本中添加了新权限,则系统会在用户更新应用程序时要求用户授予该权限。一旦用户安装了应用程序,他们唯一可以撤销权限的方法是卸载该应用程序。 请求权限API指南

1

权限分为:普通权限和危险权限。

-普通权限:对用户隐私或设备操作风险不大。如果您的应用在清单中列出了普通权限,系统会在安装时自动授予这些权限(系统不会提示用户授予普通权限,用户也无法撤销)。

-危险权限:这些权限可能会影响用户的隐私或设备的正常操作,用户必须明确同意授予这些权限。只有危险权限需要用户同意。但是,Android要求用户授予危险权限的方式取决于两个因素:

1)用户设备上运行的Android版本 2)应用所针对的系统版本(targetSdkVersion)

  • 如果设备运行的是Android 6.0(API级别23)或更高版本,并且应用程序的'targetSdkVersion'是23或更高版本,则用户在安装时不会收到任何应用程序权限通知,您的应用程序必须在运行时要求用户授予危险权限(请参阅文档以了解如何请求权限并检查它)。
  • 如果设备运行的是Android 5.1.1 (API级别22)或更低版本,或者应用程序的'targetSdkVersion'是22或更低版本,则系统会在安装时自动要求用户授予您的应用程序的所有危险权限

我只是在想...为什么我们不继续使用API级别22来进行最简单的步骤呢? - gumuruh

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