安卓6.0权限 - 权限请求放在哪里?

10

随着Android新的权限系统,我想知道如何正确地实现它。关于何时以及如何使用权限的教程似乎非常清晰。然而,我不知道谁请求权限以及在哪里请求。

所以,基本上我的问题是:启动另一个Activity的Activity是否应该事先请求权限,还是需要权限的Activity放置请求?

如果需要权限的Activity应该请求权限,那么我应该在onCreateonStart中调用requestForPermission吗?

尽管这些问题似乎非常简单,但我在文档中没有找到任何提示。

谢谢。

3个回答

4
“启动另一个Activity的Activity”是否应该事先请求权限,还是需要权限的“Activity”应该发出请求?
这取决于您。主要指导原则是:用户的操作与您请求权限之间应该有明确的联系:
- 如果您的应用程序需要某些权限才能执行有意义的操作,请在应用程序启动时请求这些权限,也许在任何“欢迎”演示之后向用户提示您为什么需要这些权限。 - 如果您的应用程序需要某些权限才能基于用户执行某些应用内操作(例如点击操作栏项或ListView行),请在用户执行该操作时请求权限。
在应用程序的半随机点请求权限只会导致用户困惑(“我做了什么?为什么它要问我这个问题?这些问题为什么会出现在Stack Overflow答案中?!”)。

我同意,你应该在执行操作之前进行请求。然而,我的问题是,在onCreate中请求是否安全?是否会导致活动泄漏或其他不良后果? - MobileMon
1
@MobileMon:从onCreate()调用requestPermissions()是安全的。唯一需要注意的是,如果用户在权限对话框在前台时旋转屏幕,您的活动仍然会被销毁和重建,因为它仍然可见。这会导致onCreate()再次运行,而您不希望再次调用requestPermissions()--如果这样做,用户将获得两个叠加的权限对话框。通过保存实例状态Bundle跟踪您的状态。请参阅此示例应用程序 - CommonsWare

3
如果您的应用程序没有特定权限可能无法正常运行,建议您编写欢迎权限流程,在其中解释为什么需要该权限并请求授权。例如:谷歌地图和位置权限。
如果应用程序的某些特定部分需要单独的权限,则可以在需要权限的方法调用之前调用权限检查。在这种情况下,您可以为需要联系人权限的函数创建一个包装器,并始终调用该包装器而不是实际方法。例如:使用语音功能进行搜索时,谷歌地图和麦克风权限。
更多详细信息请参见http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en 还可以查看https://github.com/permissions-dispatcher/PermissionsDispatcher,它可以减少很多权限代码。

这些页面对于理解用法非常有帮助。我可能会使用你提供的库来实现我的目的。谢谢。 - Denis Loh

0

每当您的X任务由于某些“Y”权限而受阻时,才请求权限。在onCreate或onStart方法中请求没有意义。

如果您在Activity开始时请求“Y”权限,则Android M和以下模型之间没有区别。利用Android M的美妙之处。例如,如果您需要存储权限来创建临时文件,则最好在应用程序内部区域即/data/data/your package name/files/中创建临时文件,而不是向用户请求存储权限。总体而言,我的观点是在必须请求“Y”权限之前尽可能地利用这些选项。

关于Activity问题,您的任务必须在某个片段或活动上运行,让该活动处理onRequestPermission结果。


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