【问题标题】:Crashes after startActivityForResult in API 27API 27 中 startActivityForResult 后崩溃
【发布时间】:2018-05-18 06:52:33
【问题描述】:

在更新到 API 27 和支持库 27.0.2 后,我突然在 Crashlytics 中得到了很多这样的堆栈跟踪:

Fatal Exception: java.lang.IllegalArgumentException
    at android.os.Parcel.readException(Parcel.java:1544)
    at android.os.Parcel.readException(Parcel.java:1493)
    at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:5108)
    at android.app.Activity.isTopOfTask(Activity.java:5688)
    at android.app.Activity.startActivityForResult(Activity.java:3973)
    at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(Source:54)
    at android.support.v4.app.FragmentActivity.startActivityForResult(Source:67)

我这样称呼它:

ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out);
startActivityForResult( intent, REQ_ACTION, options.toBundle());

我无法阅读源代码,因为它尚未发布。我什至尝试替换和使用android-26代码,但它是不同的。

上面的调用有一个警告说BaseFragmentActivityApi16.startActivityForResult只能从同一个库组调用,所以我用ActivityCompat修复了它,但我认为它不会解决崩溃问题。

这是平台问题还是我可以解决这个问题?

编辑

if (Build.VERSION.SDK_INT >= 21) {
    ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out);
    startActivityForResult(intent, REQ_ACTION, options.toBundle());
} else {
    ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out);
    ActivityCompat.startActivityForResult(this, intent, REQ_ACTION, options.toBundle());
}

如果我根据评论中的链接将其更改为上述内容,Android Studio 就会像上面一样抱怨。这可能与问题有关。

【问题讨论】:

  • 你可能会遇到这个stackoverflow.com/q/47257407/8298909(关闭,因为它基本上是一个技术支持问题)
  • @BenP。这看起来是一个完全不同的问题,不小心也涉及到 Parcelables。
  • 对我来说,它看起来更像是一个动画和支持库问题。根据这篇文章,您不应该使用 API 21 以上的 ActivityOptionsCompat:stackoverflow.com/a/42455484/1067763 我不使用它,但我仍然有这个崩溃。我认为它仍然以某种方式使用错误的版本。我用动画选项更新了问题。
  • startActivity(intent, options.toBundle());这是我在我的应用程序中使用的
  • @MuhammadSaad 这可能会解决问题,但我不想把婴儿和洗澡水一起扔出去。我需要结果,你知道的。

标签: android android-support-library startactivityforresult


【解决方案1】:

旧帖子但未回复,所以这里是我在 21+ 中找到的内容

确保您正在寻找活动对象下的 startActivityForResult。 在 Context 对象下你可以找到 startActvity 但你不会看到 startActivityForResult 方法。

如果您的上下文是 Context 类但是是一个 Activity,请确保将其转换为 Activity。

Context context = ...;
context.startActivityForResult(...); // this method will not exist
((Activity)context).startActivityForResult(...); // this method should be ok

【讨论】:

  • 这从 IDE 中删除了警告。但不确定这是否会解决崩溃。我会等几天。谢谢。我正在使用 27.1.0,崩溃来自 6.0.1
【解决方案2】:

使用 ActivityOptionsCompat 而不是 ActivityOptions 用于以下 api 21。

ActivityOptionsCompat 是一个帮助类,用于以向后兼容的方式访问 ActivityOptions 中的功能。

if (Build.VERSION.SDK_INT >= 21) {
  ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, 
  R.anim.slide_in_from_right, R.anim.fade_out);
  startActivityForResult(intent, REQ_ACTION, options.toBundle()); 
  } else {
   ActivityOptionsCompat options = ActivityOptionsCompat
  .makeCustomAnimation(activity,R.anim.slide_in_from_right,R.anim.fade_out);
   ActivityCompat.startActivity(this, intent, options.toBundle());
}

希望这会对你有所帮助。

【讨论】:

    【解决方案3】:

    你可以试试这个代码。

    startActivityForResult( intent, REQ_ACTION)
    overridePendingTransition(R.anim.slide_in_from_right,  R.anim.fade_out);
    

    【讨论】:

    • 这可能会解决它。我只需要等待几天或几周,直到我们的应用程序的下一个版本提交,我会接受答案。
    • 当然。我会等:)
    • 这种方法是否有助于解决@Herrbert74 的问题?
    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多