修复Only fullscreen opaque activities can request orientation

845 阅读1分钟

最初是在升级了

targetSdkVersion = 28

之后,屏幕方向锁定 + 不为全屏 + targetSdkVersion>26 = 在8.0的手机报Only fullscreen opaque activities can request orientation的错后直接崩溃,其他android版本则不会报。

<activity
    ...
    android:screenOrientation="portrait"
    android:theme="@style/AnimStartStyle">
</activity>

<style name="AnimStartStyle" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
    <item name="android:windowAnimationStyle">@style/AnimFade</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

原因是睿智的谷歌工程师改了段睿智的代码,总的来说,就是targetSdkVersion >= 26,设置了screenOrientation,且设置了windowIsTranslucent或windowSwipeToDismiss或windowIsFloating为true的,直接抛

throw new IllegalStateException("Only fullscreen opaque activities can request orientation");

着实睿智。8.1的源码修复了这段。 奇怪的是,我在设置了targetSdkVersion = 26时,三星s7 8.0.0系统没挂,>=27才开始挂。

修复方法

  1. 设置targetSdkVersion < 26,治标不治本;
  2. 去掉windowIsTranslucent或windowSwipeToDismiss或windowIsFloating = true的设置,因噎废食;
  3. (推荐)去掉AndroidManifest里的screenOrientation的设置,改为在Activity中加上:
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

转载自解决 Only fullscreen opaque activities can request orientation