如何捕获位置服务启动后被吊销的Android位置权限

如何捕获位置服务启动后被吊销的Android位置权限,android,geolocation,android-permissions,hybrid-mobile-app,permission-denied,Android,Geolocation,Android Permissions,Hybrid Mobile App,Permission Denied,我开发了一个Android混合应用程序,除了其他活动外,它还可以跟踪用户的位置,并向用户显示他们最近去过的地方。这通过以10秒的更新速率调用LocationServices.FusedLocationApi.RequestLocationUpdate来实现 显然,这需要位置权限,对于ANDROID Marshmallow及以上版本,在请求位置更新之前,我会检查并请求用户提供必要的位置权限 我已经阅读了许多关于同一主题的其他StackOverflow问题,但我没有找到一个令人满意的答案,即如果用户

我开发了一个Android混合应用程序,除了其他活动外,它还可以跟踪用户的位置,并向用户显示他们最近去过的地方。这通过以10秒的更新速率调用LocationServices.FusedLocationApi.RequestLocationUpdate来实现

显然,这需要位置权限,对于ANDROID Marshmallow及以上版本,在请求位置更新之前,我会检查并请求用户提供必要的位置权限

我已经阅读了许多关于同一主题的其他StackOverflow问题,但我没有找到一个令人满意的答案,即如果用户在最初授予应用程序后撤销了该应用程序的位置权限,则阻止Android终止该应用程序

在所有用户都要求停止后,我会非常高兴应用程序停止显示用户的位置和轨迹,但我不太高兴应用程序被终止,正如我前面所说,应用程序在后台运行时为用户做了许多其他事情


据我所知,没有回调可用于允许我在撤销位置权限后立即删除位置更新。我如何改变策略以避免应用程序崩溃

这并不是说我希望用户经常这样做,但我认为让应用程序尽可能防弹是一种很好的做法。请不要提醒我Android可以在后台终止任何应用程序,因为这不是我的问题

我是否需要采用单一方法而不是定期方法来请求位置,以便每次都可以重新检查是否存在许可

还是尝试捕捉错误更好。如果是,我在哪里做这件事?它会是在内部的位置改变吗

如果有人想否决这个问题,请先添加一条评论来解释原因。顺便说一句,有人对这个问题投了否决票,速度之快超出了他们的阅读速度。谁会这样做


我所说的应用程序崩溃是指进程被终止(我已经检查过了,这确实发生了)

当用户撤销运行时权限时,这是非常正常的

LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    boolean enabled = locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
我想做的是防止进程终止,如果有任何方法可以做到这一点

对不起,那是不可能的

因为我怀疑很少有用户知道他们可以撤销运行时权限,所以这不会是常见的情况,IMHO

大宗报价 然而,为什么Android开发人员不只是生成回调以允许应用程序代码库做出反应

您可以在BroadcastReceiver中注册LocationManager.PROVIDERS\u CHANGED\u操作。 当它被点击时,您可以检查提供商是否仍然处于启用状态,并相应地使用它来防止您的应用程序在有人撤销位置权限时崩溃

LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    boolean enabled = locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

“我怎样才能改变策略以避免应用程序崩溃?”——不清楚你认为你的应用程序会在哪里崩溃。当用户撤消运行时权限时,进程将终止。当用户再次运行您的应用程序时,您将检查运行时权限并采取适当的步骤。崩溃的场景到底是什么?“顺便说一句,有人对这个问题投了否决票,速度之快超出了他们的阅读速度。”——如果非要我猜的话,这就是你最初提到的“全冠”的标题。但是,这只是猜测。谢谢。我不知道这是否也是,但我没有;我没有发现它,我花了几秒钟来纠正它。我所说的应用程序崩溃是指进程被终止(我已经检查过了,这确实发生了)。现在,这会给我希望避免的用户带来问题。首先,他们必须重新登录,因为web应用程序数据是加密的,需要密码才能解密。其次,这将停止与我的服务器之间的所有通信流量。第三,用户将不知道为什么应用程序停止工作。我想做的是防止进程终止,如果有任何方法,我可以这样做。谢谢你的想法。我想你是对的,很少有用户会这么做,但是为什么Android开发人员不只是生成回调以允许应用程序代码库做出反应,同时停止发布任何位置更新。在我看来,几乎所有其他用户操作都可能被捕获。史蒂夫布鲁克:“在我看来,几乎所有其他用户的行为都可能被捕获”——一般来说,当Android终止您的进程时,例如当用户在“设置”中按下应用程序屏幕上的“强制停止”时,您无法捕获。“这肯定是一个很大的遗漏”--我希望这是出于安全原因。您是否立即知道我是否可以设置一个进程来获取单个位置修复,并设置一个计时器以在60秒的时间内重新执行此操作,每次都在后台检查权限?至少在强制停止的情况下,用户将知道应用程序即将停止。用户很容易在设置菜单中向下滚动具有位置权限的应用程序列表,并错误地关闭错误的应用程序。@SteveBrooker:在现代版本的Android中,在后台做任何事情都很麻烦,除非它是一个持续运行的前台服务。我假设这就是您现在正在使用的,并且当进程死亡时,该服务将消失。您可以使用
AlarmManager
JobScheduler
作为“看门狗”,在服务停止运行时调用服务。但是,当设备处于打瞌睡模式时,您不会得到每分钟的操作。