有没有办法以编程方式请求许可?

Posted

技术标签:

【中文标题】有没有办法以编程方式请求许可?【英文标题】:Is there any way to ask permission programmatically? 【发布时间】:2011-11-22 22:46:20 【问题描述】:

有没有办法在 android 中以编程方式请求权限?我不想将所有权限添加到 AndroidManifest.xml。那么是否有任何对话框在运行时请求权限?

【问题讨论】:

为什么不想使用清单?市场使用清单来决定是否根据用户的硬件向给定用户提供应用程序。如果你没有在清单中列出你的需求,它怎么知道? @jeffamaphone 例如,如果需要该权限的功能不是我的应用程序的核心功能。无需为每个用户对他不使用的功能拥有过多权限而烦恼。您甚至可以通过在清单中将权限标记为可选来以声明方式执行此操作。 IMO 对权限的孤注一掷的心态是关于 android 的最烦人的事情之一。 @CodeInChaos: 嗯...我很确定我已经看到应用程序通过使用通过意图调用的更小、独立的“帮助”应用程序来避开这一点。 “不想给我们的应用太多权力?好吧,安装基础应用。想要这个额外的功能吗?好吧,安装这个具有更广泛权限集的助手。” 再提一句:我看到 Android 在应用程序运行时弹出一个系统对话框,告诉我应用程序正在尝试启用蓝牙并请求我的批准。因此,至少在这种情况下,Google 似乎接受了在运行时提示用户的“风险”。 【参考方案1】:

应用程序静态声明它们所需的权限,Android 系统会在安装应用程序时提示用户同意。 Android 没有动态(在运行时)授予权限的机制,因为这会使用户体验复杂化,从而损害安全性。

Android Developer site - System Permissions

【讨论】:

我想知道时间如何变化如此之快,它可能会在 2011 年使用户体验复杂化,但在 2015 年不会;) @ay89 他们只是懒得实现它:)【参考方案2】:

直到现在,但是是的

根据Android M中引入的谷歌新权限模型:

如果在 M Preview 上运行的应用支持新的权限模型,则用户在安装或升级应用时无需授予任何权限。相反,应用程序会在需要时请求权限,系统会向用户显示一个对话框来请求权限。

以下是此新模型的关键组件的摘要:

声明权限: 应用程序在清单中声明它需要的所有权限,如 早期的 Android 平台。

权限组:权限根据其功能分为权限组。例如,CONTACTS 权限组包含读取和写入用户联系人和个人资料信息的权限。

安装时授予的有限权限:当用户安装或更新应用程序时,系统会授予该应用程序清单中列出的属于PROTECTION_NORMAL 的所有权限。例如,闹钟和互联网权限属于PROTECTION_NORMAL,因此它们会在安装时自动授予。有关如何处理普通权限的更多信息,请参阅普通权限。 系统还可以授予应用程序签名权限,如系统组件和签名权限中所述。安装时不会提示用户授予任何权限。

用户在运行时授予权限:当应用程序请求权限时,系统会向用户显示一个对话框,然后调用应用程序的回调函数通知它用户是否授予了权限。 此权限模型会更改您的应用程序对需要权限的功能的行为方式。以下是为适应此模型而应遵循的开发实践的摘要:

始终检查权限:当应用程序需要执行任何需要权限的操作时,它应该首先检查它是否已经拥有该权限。如果没有,它请求被授予该权限。您无需检查属于PROTECTION_NORMAL 的权限。

优雅地处理缺少权限:如果应用程序没有被授予适当的权限,它应该干净地处理故障。例如,如果添加的功能只需要权限,则应用可以禁用该功能。如果该权限对于应用运行至关重要,则该应用可能会禁用其所有功能并通知用户他们需要授予该权限。

权限是可撤销的:用户可以随时撤销应用程序的权限。如果用户关闭应用程序的权限,则不会通知该应用程序。同样,您的应用应在执行任何受限操作之前验证它是否需要权限。

来源:https://developer.android.com/preview/features/runtime-permissions.html

【讨论】:

【参考方案3】:

没有。在安装应用程序时,用户需要被告知权限。在运行时询问用户会带来安全风险。

【讨论】:

“在运行时询问他们会带来安全风险。”为何如此?我看到的唯一危险是点击劫持,倒计时很容易防止这种情况发生。 @CodeInChaos:“很容易阻止”?你低估了“点击可怕的安全警告看搞笑视频”的威力。 @Piskvor 这些用户也会在安装时点击警告。所以我看不出风险比安装时间警告有多大。 我根本看不到安全风险。这与在安装时验证它没有什么不同。就是塞班和黑莓10的逻辑,显然是安全性更好的平台 Android M 似乎引入了一些新的权限架构来动态包含权限。我现在也有同样的问题。【参考方案4】:

没有。

在这里回答:get Android permission dynamiclly

请参阅此处的“使用权限”部分: http://developer.android.com/guide/topics/security/security.html

【讨论】:

现在可以动态获取权限了,Android Marshmellow【参考方案5】:

Android M 引入了运行时权限,大家期待已久。此外,权限现在分为 NORMAL 和 DANGEROUS,默认情况下授予 NORMAL 权限,并在需要时请求 DANGEROUS 权限。此外,用户可以随时从设备的“设置”菜单中撤销 DANGEROUS 权限。

【讨论】:

【参考方案6】:

如果我将“Piskvor”和“Hanno Binder”的答案结合起来,您的应用可以检查辅助应用是否可用(尝试使用 Intent 调用它),以及它是否不存在(调用失败) ,提示用户安装。

例如,看看下面的内容。

how to download adobe reader programatically if not exists

【讨论】:

以上是关于有没有办法以编程方式请求许可?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法以编程方式对 Android 上的系统权限对话框执行输入操作?

有没有办法以编程方式调整屏幕亮度?

有没有办法以编程方式启用 POP

有没有办法以编程方式在 BlackBerry 上设置数字锁定?

有没有办法以编程方式访问 iOS 图像描述器?

有没有办法以编程方式控制 DirectShow VSFilter?