如何陷阱 Android 位置服务启动后位置权限被撤销?
How to Trap Android Location Permission Revoked after Location Service Started?
我开发了一个 Android 混合应用程序,在其他活动中跟踪用户位置并将其显示给用户,显示他们最近去过的地方。这通过以 10 秒的更新速率调用 LocationServices.FusedLocationApi.requestLocationUpdates 来实现。
显然这需要位置权限,对于 ANDROID Marshmallow 及更高版本,我会在请求位置更新之前检查并请求用户获得必要的位置权限。
我已经阅读了许多关于同一主题的其他 Whosebug 问题,但我没有找到关于防止 Android 在用户最初授予应用程序后撤销位置权限时终止应用程序的令人满意的答案.
如果用户要求停止显示用户的位置和轨迹,我会非常高兴,但我对终止应用程序不太高兴,因为我前面说过,该应用程序在后台为用户做很多其他事情,同时 运行。
据我所知,一旦位置权限被撤销,就没有回调可以让我删除位置更新。我怎样才能改变我的策略来避免应用程序崩溃?
我并不是希望用户经常这样做,但我认为让应用程序尽可能防弹是一种很好的做法。请不要提醒我 Android 可以在后台终止任何应用程序,因为这不是我的问题。
我是否需要采用单一而不是周期性的方法来请求位置,以便我每次都可以重新检查权限是否存在。
还是尝试捕获错误更好。如果是这样,我在哪里做这个?它会在 onLocationChanged 内吗?
What I mean by app crash is that the process is terminated (I have checked and this actually happens)
当用户撤销运行时权限时,这是完全正常的。
What I would like to do is prevent the process terminating if there is any way I can do this.
抱歉,这不可能。
因为我怀疑很少有用户甚至知道他们 可以 撤销运行时权限,恕我直言,这不会经常发生。
Blockquote
however why did the Android developers not just cause a callback to be generated to allow the app code base to react
您可以在 BroadcastReceiver 中注册 LocationManager.PROVIDERS_CHANGED_ACTION。
当它被击中时,您可以检查提供程序是否仍处于启用状态并相应地使用它来防止您的应用程序在有人撤销位置权限时崩溃。
LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
boolean enabled = locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
我开发了一个 Android 混合应用程序,在其他活动中跟踪用户位置并将其显示给用户,显示他们最近去过的地方。这通过以 10 秒的更新速率调用 LocationServices.FusedLocationApi.requestLocationUpdates 来实现。
显然这需要位置权限,对于 ANDROID Marshmallow 及更高版本,我会在请求位置更新之前检查并请求用户获得必要的位置权限。
我已经阅读了许多关于同一主题的其他 Whosebug 问题,但我没有找到关于防止 Android 在用户最初授予应用程序后撤销位置权限时终止应用程序的令人满意的答案.
如果用户要求停止显示用户的位置和轨迹,我会非常高兴,但我对终止应用程序不太高兴,因为我前面说过,该应用程序在后台为用户做很多其他事情,同时 运行。
据我所知,一旦位置权限被撤销,就没有回调可以让我删除位置更新。我怎样才能改变我的策略来避免应用程序崩溃?
我并不是希望用户经常这样做,但我认为让应用程序尽可能防弹是一种很好的做法。请不要提醒我 Android 可以在后台终止任何应用程序,因为这不是我的问题。
我是否需要采用单一而不是周期性的方法来请求位置,以便我每次都可以重新检查权限是否存在。
还是尝试捕获错误更好。如果是这样,我在哪里做这个?它会在 onLocationChanged 内吗?
What I mean by app crash is that the process is terminated (I have checked and this actually happens)
当用户撤销运行时权限时,这是完全正常的。
What I would like to do is prevent the process terminating if there is any way I can do this.
抱歉,这不可能。
因为我怀疑很少有用户甚至知道他们 可以 撤销运行时权限,恕我直言,这不会经常发生。
Blockquote however why did the Android developers not just cause a callback to be generated to allow the app code base to react
您可以在 BroadcastReceiver 中注册 LocationManager.PROVIDERS_CHANGED_ACTION。 当它被击中时,您可以检查提供程序是否仍处于启用状态并相应地使用它来防止您的应用程序在有人撤销位置权限时崩溃。
LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
boolean enabled = locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);