【问题标题】:Marshmallow app-permission: android.location.PROVIDERS_CHANGED is not firedMarshmallow app-permission: android.location.PROVIDERS_CHANGED 没有被触发
【发布时间】:2016-03-11 12:46:20
【问题描述】:
我有一个应用程序可以侦听 android.location.PROVIDERS_CHANGED 广播以了解手机当前的位置功能。
使用 Android M 和新的 App-runtime 权限,当从系统/常规面板更改位置时,它可以正常工作。但如果用户专门为应用禁用了位置权限,则不会触发相同的广播。
到目前为止,我可以使用常规的 AlarmManager 测试位置访问,但它很奇怪而且响应速度不快。
是否有任何其他特定方法,理想情况下是一种可以注册的 BroadcastReceiver,让我们随时了解 Android M 的此位置 app-permission-change?
【问题讨论】:
标签:
android
android-6.0-marshmallow
location-services
【解决方案1】:
抱歉,您不会直接收到有关位置或其他权限的权限更改的通知,除非有一些我不知道的未记录的黑客行为。
如果用户撤销权限,您的应用进程将被终止。这个想法是,当您的应用再次运行并致电checkSelfPermission() 时,您会发现被撤销的权限。该流程针对更传统的情况进行了优化,其中权限检查是在用户打开的活动中进行的。它不能很好地处理您的情况(尽管,恕我直言,位置权限不应影响您所描述的广播)。
在 N 开发者预览版中,您现在可以设置 JobScheduler 来监控 Uri 的更改并根据需要触发您的工作。这有点像注册ContentObserver,除了你不需要进程一直运行——JobScheduler 注册观察者并根据需要调用你的JobService。我认为启用位置源的名单可以在某处的Settings 提供程序中找到;如果是这样,对于 Android 6.1/7.0/Turbo System 5000/无论 N 变成什么,您也许可以使用JobScheduler 来了解位置源的变化,而不是依赖广播。
不过,这对 Android 6.0 没有帮助。您可以使用JobScheduler 或AlarmManager 或其他东西来查看您是否失去了权限(通过checkSelfPermission()),但这有点浪费电池寿命(因此,在打盹模式和可能的应用程序中无法正常工作待机)。