如何在定位服务启动后捕获撤销的 Android 定位权限?
Posted
技术标签:
【中文标题】如何在定位服务启动后捕获撤销的 Android 定位权限?【英文标题】:How to Trap Android Location Permission Revoked after Location Service Started? 【发布时间】:2018-09-11 01:24:39 【问题描述】:我开发了一个 android 混合应用程序,它在其他活动中跟踪用户位置并将其显示给用户,显示他们最近去过的地方。这通过以 10 秒的更新速率调用 LocationServices.FusedLocationApi.requestLocationUpdates 来实现。
显然这需要位置权限,对于 ANDROID Marshmallow 及更高版本,我在请求位置更新之前检查并请求用户提供必要的位置权限。
我已经阅读了许多关于同一主题的其他 *** 问题,但我还没有找到一个令人满意的答案,即如果用户在最初授予应用程序的位置权限后撤销了该应用程序的位置权限,则防止 Android 终止该应用程序。
我会非常高兴应用程序停止显示用户的位置和轨迹,毕竟用户已经要求停止它,但我不高兴应用程序被终止,正如我之前所说该应用程序在后台运行时为用户执行许多其他操作。
据我了解,一旦撤销位置权限,没有回调可用于让我删除位置更新。如何更改策略以避免应用崩溃?
我并不希望用户经常这样做,但我认为让应用程序尽可能防弹是一种很好的做法。请不要提醒我 Android 可以在后台终止任何应用程序,因为这不是我的问题。
我是否需要采用单一而不是定期的方法来请求位置,以便我每次都可以重新检查权限是否存在。
还是尝试捕获错误更好。如果是这样,我在哪里做?会在 onLocationChanged 里面吗?
【问题讨论】:
“我怎样才能改变我的策略来避免应用程序崩溃?”——不清楚你认为你的应用程序会在哪里崩溃。当用户撤销运行时权限时,您的进程将被终止。当用户再次运行您的应用程序时,您检查运行时权限并采取适当的步骤。崩溃的场景到底是什么? “顺便说一句,有人对这个问题投反对票的速度比他们阅读它的速度还快。” ——如果我不得不猜测,那是你最初的全大写标题。但是,这只是一个猜测。 谢谢。我想知道是不是也这样,但我没有发现它,我花了几秒钟才纠正它。 我所说的应用程序崩溃是指进程被终止(我已经检查过,这确实发生了)。现在这会给用户带来我希望避免的问题。首先,他们必须重新登录,因为 Web 应用程序数据已加密并且需要密码才能解密。其次,这将停止所有进出我的服务器的通信流量。第三,用户将不知道应用程序停止工作的原因。如果有任何方法可以做到这一点,我想做的是防止进程终止。 【参考方案1】:我所说的应用程序崩溃是指进程被终止(我已经检查过,这确实发生了)
这是完全正常的,当用户撤销运行时权限时。
如果有任何方法可以做到这一点,我想做的是防止进程终止。
抱歉,这是不可能的。
由于我怀疑很少有用户知道他们可以撤销运行时权限,所以这不会是常见的情况,恕我直言。
【讨论】:
感谢您的想法。我希望您是正确的,因为很少有用户会这样做,但是为什么 Android 开发人员不只是导致生成回调以允许应用程序代码库做出反应,同时停止发布更多位置更新。在我看来,几乎所有其他用户操作都可以被捕获。这肯定是一个很大的遗漏。 @Steve***er:“在我看来,几乎所有其他用户操作都可以被捕获”——当 Android 通常终止您的进程时,您无法捕获,例如当用户按下“强制停止”时设置中的应用程序屏幕。 “这肯定是一个很大的遗漏”——我希望这样做是出于安全原因。 您是否知道我是否可以设置一个流程来获取单个位置修复并设置一个计时器以在 60 秒内重做此操作,每次检查权限,同时在后台? 至少通过强制停止,用户会知道应用程序要停止。如果用户在设置菜单中向下滚动具有位置权限的应用程序列表并错误地关闭错误的应用程序列表,那将是一件很容易的事情。 @Steve***er:在现代版本的 Android 中在后台做任何事情都很麻烦,除非它是一个持续运行的前台服务。我假设这就是您现在正在使用的,并且当进程终止时该服务就会消失。您可以使用AlarmManager
或JobScheduler
作为“看门狗”,以在服务停止运行时调用它。但是,当设备处于打盹模式时,您不会获得每分钟的操作。【参考方案2】:
块引用 但是,为什么 Android 开发人员不只是导致生成回调以允许应用代码库做出反应
您可以在 BroadcastReceiver 中注册 LocationManager.PROVIDERS_CHANGED_ACTION。 当它被击中时,您可以检查提供程序是否仍处于启用状态,并相应地使用它来防止您的应用在有人撤销位置权限时崩溃。
LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
boolean enabled = locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
【讨论】:
以上是关于如何在定位服务启动后捕获撤销的 Android 定位权限?的主要内容,如果未能解决你的问题,请参考以下文章
未捕获(承诺中)TypeError:无法在已撤销的代理上执行“设置”