我们正在使用Android后台服务进行位置跟踪,注册融合的google api以进行定期更新。 当我们开始进行位置更新服务时,我们会要求获得位置许可,如果用户接受,我们就会启动服务并注册融合的google api。
但现在问题是,一旦用户接受了权限并且注册了位置更新的融合位置api,以后用户就从应用程序的设备设置中撤消了位置权限。 一旦用户执行此操作,应用程序就会因
而崩溃java.lang.SecurityException:客户端必须具有ACCESS_FINE_LOCATION权限才能请求PRIORITY_HIGH_ACCURACY位置。
如何处理这种情况?
答案 0 :(得分:1)
这不是错误。这是Android 6(棉花糖)及以上版本的问题,或者我们可以说功能。这是因为Google从Android Marshmallow更改了用户授予危险权限(例如位置权限)访问权限的方式,现在他们可以撤消该权限。在您的情况下,正在发生的情况是savedInstanceState
值变得无效,因为您的应用程序进程在撤销许可后被杀死并重新启动。
一种可能的解决方法是将null传递给活动的onCreate()
。这是因为即使您的进程被终止,savedInstanceState
仍然保留并在您返回到应用程序后返回。如果您在未打开应用程序的情况下执行了相同的操作,则不会崩溃,因为savedInstanceState
为空。但是,如果后台服务正在对位置执行某些任务,则一旦您从设备设置中撤消了位置许可,该应用就会崩溃。
答案 1 :(得分:0)
在您的主要活动中添加此方法,并使用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中添加两个权限