当前位置:   article > 正文

Android Crash:Only fullscreen opaque activities can request orientation_only fullscreenopaque activities can request orien

only fullscreenopaque activities can request orientationatandroid.app.activi

crash信息:

  1. Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
  2. at android.app.Activity.onCreate(Activity.java:1081)
  3. at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:278)
  4. at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
  5. at arm.sankuai.moma.base.AbstractActivity.onCreate(AbstractActivity.kt:31)
  6. at arm.sankuai.moma.base.BaseActivity.onCreate(BaseActivity.java:26)
  7. at arm.sankuai.moma.poi.poi_list.SeaBaseActivity.onCreate(SeaBaseActivity.java:60)
  8. at arm.sankuai.moma.poi.poi_list.PublicSeaActivity.onCreate(PublicSeaActivity.java:34)
  9. at android.app.Activity.performCreate(Activity.java:7372)
  10. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
  11. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
  12. ... 9 more

crash原因:

  1. @MainThread
  2. @CallSuper
  3. protected void onCreate(@Nullable Bundle savedInstanceState) {
  4. if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
  5. // target 大于26 指定方向
  6. if (getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation()) {
  7. final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
  8. // 透明或悬浮
  9. final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
  10. ta.recycle();
  11. if (isTranslucentOrFloating) {
  12. throw new IllegalStateException(
  13. "Only fullscreen opaque activities can request orientation");
  14. }
  15. }
  16. Activity.java
  17. ------------------------------------------------
  18. ActivityInfo.java
  19. /**
  20. * Determines whether the {@link Activity} is considered translucent or floating.
  21. * @hide
  22. */
  23. public static boolean isTranslucentOrFloating(TypedArray attributes) {
  24. final boolean isTranslucent =
  25. attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent,
  26. false);
  27. final boolean isSwipeToDismiss = !attributes.hasValue(
  28. com.android.internal.R.styleable.Window_windowIsTranslucent)
  29. && attributes.getBoolean(
  30. com.android.internal.R.styleable.Window_windowSwipeToDismiss, false);
  31. final boolean isFloating =
  32. attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating,
  33. false);
  34. return isFloating || isTranslucent || isSwipeToDismiss;
  35. }
  36. /**
  37. * Returns true if the specified orientation is considered fixed.
  38. * @hide
  39. */
  40. static public boolean isFixedOrientation(int orientation) {
  41. return isFixedOrientationLandscape(orientation) || isFixedOrientationPortrait(orientation);
  42. }
  43. /**
  44. * Returns true if the activity's orientation is fixed to landscape.
  45. * @hide
  46. */
  47. public static boolean isFixedOrientationLandscape(@ScreenOrientation int orientation) {
  48. return orientation == SCREEN_ORIENTATION_LANDSCAPE
  49. || orientation == SCREEN_ORIENTATION_SENSOR_LANDSCAPE
  50. || orientation == SCREEN_ORIENTATION_REVERSE_LANDSCAPE
  51. || orientation == SCREEN_ORIENTATION_USER_LANDSCAPE;
  52. }
  53. /**
  54. * Returns true if the activity's orientation is fixed to portrait.
  55. * @hide
  56. */
  57. public static boolean isFixedOrientationPortrait(@ScreenOrientation int orientation) {
  58. return orientation == SCREEN_ORIENTATION_PORTRAIT
  59. || orientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
  60. || orientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
  61. || orientation == SCREEN_ORIENTATION_USER_PORTRAIT;
  62. }
  63. // Oreo 8.1.0_r33源码如下:
  64. @MainThread
  65. @CallSuper
  66. protected void onCreate(@Nullable Bundle savedInstanceState) {
  67. if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
  68. // 发现代码删除,bug修复
  69. if (mLastNonConfigurationInstances != null) {
  70. mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);
  71. }

结论:

Activity方向为:Portrait、 Landscape(以及相关的方向)和SCREEN_ORIENTATION_LOCKED

activity样式为:R.styleable.Window_windowIsTranslucent、R.styleable.Window_windowSwipeToDismiss或者R.styleable.Window_windowIsFloating

target 大于26

以上条件满足时会在activity onCreate方法中触发Crash,且只在8.0机器上出现。

适配方案

1、不指定方向

2、不在Manifest文件中指定方向,通过代码根据系统版本决定是否指定方向

  1. public static void fixedOrientation(@NonNull Activity activity) {
  2. if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
  3. activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  4. }
  5. }

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/375882
推荐阅读
相关标签
  

闽ICP备14008679号