我们使用android后台服务进行位置跟踪,注册融合的google定期更新位置。当我们为位置更新启动服务时,我们请求位置许可,如果用户接受,则启动服务并注册融合的google。
但是现在出现的问题是,一旦用户接受了权限并注册了位置更新的融合位置api,用户就会从应用程序的设备设置中撤销位置权限。一旦用户这样做,应用程序就开始崩溃,原因是
java.lang.SecurityException:客户端必须拥有ACCESS_FINE_LOCATION权限才能请求PRIORITY_HIGH_ACCURACY位置。
如何处理这种情况?
发布于 2019-06-26 05:40:30
,这不是一个bug,,这是一个Android6 (Marshmallow)和上面的问题,或者我们可以说是特性。这是因为通过Android Marshmallow,Google改变了用户对危险的权限(比如位置权限)的访问方式,并且他们现在有能力撤销它。在您的示例中,所发生的情况是savedInstanceState
值变得无效,因为您的应用程序进程在撤销权限后被终止并重新启动。
一个可能的解决方法是将null传递给活动的onCreate()
。这是因为即使在您的进程被杀死之后,savedInstanceState
仍然保持不变,并在您返回应用程序后返回。如果没有打开应用程序就做了同样的事情,它就不会崩溃,因为savedInstanceState
是空的。但是,如果后台服务正在对位置执行某些任务,一旦从设备设置中撤销位置权限,应用程序就会崩溃。
发布于 2017-12-23 09:26:39
在您的主要活动中添加此方法,并在您的onCreate()
方法中调用它;
public boolean havePermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
ActivityCompat.requestPermissions(this , new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
return false;
}
}
else {
return true;
}
}
不要忘记在您的mainifest.xml中添加thoes两个权限
https://stackoverflow.com/questions/47950773
复制相似问题