【问题标题】:Android - app crash due to location permission revoked from settingAndroid - 由于位置权限从设置中撤消而导致应用程序崩溃
【发布时间】:2018-06-05 15:42:30
【问题描述】:

我们正在使用 android 后台服务进行位置跟踪,其中注册融合的 google api 以进行定期位置更新。 当我们必须启动服务以进行位置更新时,我们会请求位置许可,如果用户接受,则我们启动服务并注册融合的 google api。

但是现在问题来了,一旦用户接受了权限并融合了注册位置更新的位置 api,后来用户从应用程序的设备设置中撤销了位置权限。 一旦用户这样做,应用程序就会因为

而开始崩溃

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

如何处理这种情况?

【问题讨论】:

  • 每次请求位置时检查权限。
  • 将其放入 try catch 块中并发出通知,要求用户授予继续正确使用应用程序的权限
  • 问题是,我已经设置了周期性的融合定位api控制。

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


【解决方案1】:

这不是错误。这是 Android 6 (Marshmallow) 及更高版本的问题,或者我们可以说是功能。这是因为从 Android Marshmallow 开始,谷歌改变了用户授予危险权限(如位置权限)的方式,并且他们现在可以撤销它。在您的情况下,发生的情况是 savedInstanceState 值变得无效,因为您的应用程序进程在您撤销权限后被杀死并重新启动。

一种可能的解决方法是将 null 传递给活动的onCreate()。这是因为即使您的进程被终止,savedInstanceState 仍然存在,并在您返回应用程序后返回。如果您在没有打开应用程序的情况下执行相同的操作,它不会崩溃,因为savedInstanceState 为空。但是在后台服务的情况下,它正在对位置执行一些任务,一旦您从设备设置中撤消位置权限,应用程序就会崩溃。

【讨论】:

    【解决方案2】:

    在你的主要活动中添加这个方法并在你的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 中添加两个权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多