【问题标题】:从设置中禁用权限并返回我们的应用程序崩溃后
【发布时间】:2018-09-02 23:30:07
【问题描述】:

当当前activity跳转到系统设置页面禁用权限再切换当前activity时,应用崩溃

第 1 步:打开应用并授予所有必要的权限

第 2 步:单击主页按钮(因此应用程序在后台)

第 3 步:在设置中手动更改权限

第 4 步:从多任务启动应用,现在由于应用上下文无效而崩溃

观察到应用程序再次创建,不明白为什么会发生这种情况。欢迎提出任何纠正此问题的建议!

【问题讨论】:

  • 发布你的日志
  • “观察到应用程序被再次创建” - 这就是应该发生的事情。在做任何需要危险许可的事情时,您需要考虑到这种可能性。
  • 如果您的活动中有 Fragment,那么您需要从 Stack 中获取 Fragment 然后替换它。
  • 你有日志或崩溃报告吗?
  • 你解决了吗,我也遇到了同样的问题,如果解决了请更新我。

标签: android android-permissions runtime-permissions


【解决方案1】:

对于我的用例,我发现解决此问题的最有效解决方案是在我的设置屏幕中更改权限后返回应用程序时简单地检查我确定为空的特定视图。这导致在恢复应用时有几个 View 为空,从而导致致命错误。

基本上,在您的应用处于后台时更改权限的阶段,Android 会为您的应用创建一个恢复应用的新流程;使您之前的流程无效。您可以使用 Log 语句来记录差异,使用类似这样的东西进行测试,您应该会看到 Activity 标识符不同:

Log.v("YOURTAGHERE", String.valueOf(activity));

我遇到了同样的问题并实施了以下操作来简单地重新启动应用程序,这解决了我的用例的问题:

if (mTabView == null) {
    Intent intent = new Intent(sActivity, SplashActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK);
    sActivity.startActivity(intent);
    sActivity.finish();
}

【讨论】:

    【解决方案2】:

    在我的例子中,应用需要位置权限 (ACCESS_FINE_LOCATION) 来检测坐标。因此,当用户手动将设置中的权限从启用更改为禁用时,它会重新启动。据我了解,MainActivity 尝试启动,但 onCreate 没有执行。相反,FragmentManager 中的所有片段都开始创建。因为他们可以访问MainActivity(还没有创建),所以会抛出异常。

    要克服这个异常,您应该看到一个堆栈跟踪,并在 构造函数 中找到访问它的活动或应用程序的片段。例如,您在 Fragment 或 ViewModel 中定义了一个获取 GPS 状态的局部变量(它将在 init 块中计算)。

    另请参阅Android 6 Permissions => Crash when disable permission and go back to the appActivity restart every time when disable permission from setting

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多