android M中权限更改的广播动作

Posted

技术标签:

【中文标题】android M中权限更改的广播动作【英文标题】:broadcast action on permission change in android M 【发布时间】:2015-09-22 13:59:44 【问题描述】:

当从设置更改其权限设置时,应用程序是否会收到任何广播或任何类型的警报?我有一个场景,我们在应用程序启动并获得 LOCATION GROUP 权限时开始某种日志记录。但是当用户在我们的应用程序崩溃之间撤销此权限时。当用户取消记录时,找不到任何方法来停止记录。此日志记录来自 3rd 方库,因此我们不能在两者之间进行任何检查权限检查。

【问题讨论】:

没有广播,只能查看权限是否被授予 这有点像 suxors,尤其是如果您有一个在后台运行的服务,并且具有 必需、提示和批准的权限,但有人对 w/ 权限置之不理并拒绝了它 同时它正在运行。如果没有通知权限更改的事件,该服务将似乎继续正常运行。它必须遵循天真的建议的做法,即为已批准的权限的每次调用测试权限。最好是捕获一个事件并暂停服务并通过一流的通知提示恢复需要权限。 【参考方案1】:

当从设置更改其权限设置时,应用程序是否会收到任何广播或任何类型的警报?

没有记录。

如果用户撤销之前授予您的权限,您的进程将被终止。下次运行时,您最终会发现权限更改是检查权限的一部分。

如果用户授予之前被拒绝的权限,您的进程不会终止。但是,再一次,当您拨打checkSelfPermission() 时,您会发现您可以访问。

这里的教训是:不要缓存权限查找结果。他们似乎是相当便宜的电话,所以只需根据需要拨打checkSelfPermission()

如果您的 targetSdkVersion 低于 23,checkSelfPermission() 将无济于事,但您应该得到虚假数据而不是 SecurityException。在位置修复的情况下,如果用户撤销了您的位置访问权限,您不应获得任何位置。

但是当用户在我们的应用程序崩溃之间撤销此权限时

我没有尝试过后台服务正在运行并且用户撤销权限的情况。它应该终止您的进程,因此您会在下次运行服务时发现权限更改。如果您发现您的进程没有被终止,这可能是 android 中存在错误的迹象。

【讨论】:

实际上我可以从设置/应用程序中撤消权限,然后能够切换回我的应用程序。 我撤销了权限,现在当我执行 ps 时,我看不到进程正在运行,但我的应用程序仍在最近的应用程序列表中,我可以从那里启动它。有什么方法可以从最近的应用列表中清除它吗? 我们有一个第三方库来记录日志,这个库有一个警报。此警报的广播接收器查找当前位置。我们只有两个选项,我们可以开始记录或停止记录。当应用程序以位置权限启动时,我们开始记录。现在我们转到设置并撤销位置权限,然后从最近的应用程序列表中再次打开此应用程序。我们的应用程序在第三方库的广播接收器中崩溃。当权限被撤销时,我没有找到任何停止记录的方法。 @SumitShrivastava: "我们的应用程序在第三方库的广播接收器中崩溃" -- 然后联系第三方库的作者与他们一起添加 Android 6.0 运行时权限支持,或者停止使用那个图书馆。或者,确定当您的应用程序从最近的任务列表启动而不是从干净的启动启动时,导致此崩溃的应用程序是什么原因。显然,您的应用程序在这里必须做一些事情;否则,当您的应用以任何方式启动时,您将在 100% 的时间内在接收器中崩溃。 @CommonsWare 当权限被撤销,整个进程被终止,当App重启时,最后一个Activity正在启动,有没有办法强制Launcher(Manifest中指定的)Activity要开始了吗?

以上是关于android M中权限更改的广播动作的主要内容,如果未能解决你的问题,请参考以下文章

用于应用权限的 Android 广播接收器

如何在android中以编程方式更改文件/文件夹权限

测试READ_PHONE_STATE的Android M权限(危险权限)

Android常用动作广播类别消息类型

android:静态广播和动态广播

如何在 Android M 或更高版本中在运行时更改权限时防止重新创建 Activity