Сбои после startActivityForResult в 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());

Я не могу прочитать исходный код, так как он еще не выпущен. Я даже пытался заменить и использовать код андроида-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 будет жаловаться, как указано выше. Это может быть связано с проблемой.


person Herrbert74    schedule 04.12.2017    source источник
comment
Возможно, вы столкнулись с этим stackoverflow.com/q/47257407/8298909 (закрыто, так как это в основном вопрос технической поддержки)   -  person Ben P.    schedule 04.12.2017
comment
@БенП. Это выглядит совершенно по-другому, случайно задействовав и Parcelables.   -  person Herrbert74    schedule 07.12.2017
comment
Для меня это больше похоже на проблему с анимацией и библиотекой поддержки. Согласно этому посту вы не должны использовать ActivityOptionsCompat выше API 21: stackoverflow.com/a/42455484/1067763 не использую его, но у меня все еще есть этот сбой. Я думаю, что он все еще использует неправильную версию. Я обновил вопрос с помощью опции анимации.   -  person Herrbert74    schedule 07.12.2017
comment
startActivity(намерение, options.toBundle()); Это то, что я использую в своем приложении   -  person Muhammad Saad    schedule 07.12.2017
comment
@MuhammadSaad Это может решить проблему, но я не хочу выплескивать ребенка вместе с водой из ванны. Мне нужен результат, понимаешь.   -  person Herrbert74    schedule 07.12.2017


Ответы (3)


Вы можете попробовать этот код.

startActivityForResult( intent, REQ_ACTION)
overridePendingTransition(R.anim.slide_in_from_right,  R.anim.fade_out);
person Muhammad Saad    schedule 07.12.2017
comment
Это, вероятно, решит это. Мне просто нужно подождать несколько дней или недель, пока не будет отправлена ​​​​следующая версия нашего приложения, и я приму ответ. - person Herrbert74; 07.12.2017
comment
Конечно. я буду ждать :) - person Muhammad Saad; 07.12.2017
comment
Помог ли этот подход решить проблему @ Herrbert74? - person lini sax; 09.04.2019

Старый пост, но без ответа, так что вот что я нашел в 21+

Убедитесь, что вы ищете startActivityForResult в объекте активности. В объекте Context вы можете найти startActivity, но вы не увидите метод startActivityForResult.

Если ваш контекст является классом Context, но является действием, убедитесь, что вы привели его к действию.

Context context = ...;
context.startActivityForResult(...); // this method will not exist
((Activity)context).startActivityForResult(...); // this method should be ok
person Zunair    schedule 19.08.2018
comment
Это удалило предупреждение из IDE. Но не уверен, что это решит проблему. Я подожду несколько дней. Спасибо. Я использую 27.1.0, а сбой с 6.0.1. - person Aram; 12.12.2018

Используйте 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());
}

Надеюсь, что это поможет вам.

person Vishal Chauhan    schedule 07.12.2017