美文网首页
java.lang.IllegalStateException:

java.lang.IllegalStateException:

作者: 天青色等Y雨 | 来源:发表于2019-11-25 10:32 被阅读0次

\color{#000042}{ 完整错误日志:}

Unable to start activity ComponentInfo{com.cloudcreate.cloudcreateoffice/com.cloudcreate.cloudcreateoffice
.MainActivity}: java.lang.IllegalStateException: Only fullscreen activities can request orientation

\color{#000042}{原因: 安卓8.0版本时为了支持全面屏,增加了一个限制:如果是透明的Activity}
\color{#000042}{,则不能固定它的方向,因为它的方向其实是依赖其父Activity的(因为透明)。}
\color{#000042}{然而这个bug只有在8.0中有,8.1中已经修复。}

  • \color{#000042}{之前我在BaseActivity中设置默认竖屏,没有判断8.0,所以出现错误}
// Activity不是透明且没有指定屏幕方向,默认设置为竖屏
if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

\color{#000042}{解决办法: }

// 上边代码修改成:
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) {
            // android8.0要求不能设置全屏透明的Activity横竖屏
            fixOrientation();
} else {
            // 当前 Activity 不能是透明的并且没有指定屏幕方向,默认设置为竖屏
            if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
/**
 * 设置竖屏
 */
private boolean fixOrientation() {
      try {
            Field field = Activity.class.getDeclaredField("mActivityInfo");
            field.setAccessible(true);
            ActivityInfo o = (ActivityInfo) field.get(this);
            // 设置竖屏
            o.screenOrientation = 1;
            field.setAccessible(false);
            return true;
       } catch (Exception e) {
            e.printStackTrace();
       }
       return false;
}

/**
 * 是否是全屏或者悬浮
 */
private boolean isTranslucentOrFloating() {
      boolean isTranslucentOrFloating = false;
      try {
          int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
          final TypedArray ta = obtainStyledAttributes(styleableRes);
          Method m = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
          m.setAccessible(true);
          isTranslucentOrFloating = (boolean) m.invoke(null, ta);
          m.setAccessible(false);
      } catch (Exception e) {
          e.printStackTrace();
      }
      return isTranslucentOrFloating;
}

/**
 * 设置方向的时候:直接不能设置
 */
@Override
public void setRequestedOrientation(int requestedOrientation) {
      if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) {
           return;
      }
      super.setRequestedOrientation(requestedOrientation);
}

源地址: https://blog.csdn.net/starry_eve/article/details/82777160

相关文章

网友评论

      本文标题:java.lang.IllegalStateException:

      本文链接:https://www.haomeiwen.com/subject/zzjdwctx.html