在 API 27 中的 startActivityForResult 后崩溃
Crashes after startActivityForResult in API 27
更新到 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());
}
如果我根据评论中的 link 将其更改为上述内容,Android Studio 会像上面一样抱怨。这可能与问题有关。
您可以试试这个代码。
startActivityForResult( intent, REQ_ACTION)
overridePendingTransition(R.anim.slide_in_from_right, R.anim.fade_out);
使用 ActivityOptionsCompat 而不是 ActivityOptions 以下 api 21.
ActivityOptionsCompat is a helper class for accessing features in ActivityOptions in a backwards compatible fashion.
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());
}
希望对您有所帮助。
旧 post 但未得到答复,所以这是我在 21+
中找到的内容
确保您在 activity 对象下寻找 startActivityForResult。
在 Context 对象下,您可以找到 startActvity,但看不到 startActivityForResult 方法。
如果您的上下文是 Context class 但是是 activity 那么请确保将其转换为 Activity.
Context context = ...;
context.startActivityForResult(...); // this method will not exist
((Activity)context).startActivityForResult(...); // this method should be ok
更新到 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());
}
如果我根据评论中的 link 将其更改为上述内容,Android Studio 会像上面一样抱怨。这可能与问题有关。
您可以试试这个代码。
startActivityForResult( intent, REQ_ACTION)
overridePendingTransition(R.anim.slide_in_from_right, R.anim.fade_out);
使用 ActivityOptionsCompat 而不是 ActivityOptions 以下 api 21.
ActivityOptionsCompat is a helper class for accessing features in ActivityOptions in a backwards compatible fashion.
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());
}
希望对您有所帮助。
旧 post 但未得到答复,所以这是我在 21+
中找到的内容确保您在 activity 对象下寻找 startActivityForResult。 在 Context 对象下,您可以找到 startActvity,但看不到 startActivityForResult 方法。
如果您的上下文是 Context class 但是是 activity 那么请确保将其转换为 Activity.
Context context = ...;
context.startActivityForResult(...); // this method will not exist
((Activity)context).startActivityForResult(...); // this method should be ok