安卓 - 因设置

时间:2017-12-23 07:48:32

标签: android service crash android-permissions android-fusedlocation

我们正在使用Android后台服务进行位置跟踪,注册融合的google api以进行定期更新。 当我们开始进行位置更新服务时,我们会要求获得位置许可,如果用户接受,我们就会启动服务并注册融合的google api。

但现在问题是,一旦用户接受了权限并且注册了位置更新的融合位置api,以后用户就从应用程序的设备设置中撤消了位置权限。 一旦用户执行此操作,应用程序就会因

而崩溃
  

java.lang.SecurityException:客户端必须具有ACCESS_FINE_LOCATION权限才能请求PRIORITY_HIGH_ACCURACY位置。

如何处理这种情况?

2 个答案:

答案 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中添加两个权限