这段时间把App的targetSDKVersion升级到了27,昨晚上线之后今早看到后台一堆崩溃,全是 Android 8.0 的设备,因为手头设备有限,测试的时候只测了Android 8.1的设备,没想到还有一个这个坑埋在这里,记录一下处理办法。
问题分析
当targetSDKVersion为26或者27时,在 Android 8.0 的设备上,一些设置了windowIsTranslucent标志,将背景设为透明,同事将屏幕方向锁定的Activity,会崩溃并抛出这个异常:
|
1 2 3 4 5 6 |
Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation at android.app.Activity.onCreate(Activity.java:1007) at android.support.v4.app.SupportActivity.onCreate(SupportActivity.java:66) at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:321) at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84) at ... |
这个问题网上有很多讨论以及解决方法,问题的原因出自这里
|
1 2 3 4 |
if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen && appInfo.targetSdkVersion >= O) { throw new IllegalStateException("Only fullscreen activities can request orientation"); } |
这里做了当屏幕方向锁定了并且不为全屏并且 App 的targetSdkVersion 大于 Android O的话,就会抛出这个异常。
是否为全屏的判定如下:
|
1 2 3 4 5 6 7 8 9 10 |
public static boolean isTranslucentOrFloating(TypedArray attributes) { final boolean isTranslucent = attributes.getBoolean( com.android.internal.R.styleable.Window_windowIsTranslucent, false); final boolean isSwipeToDismiss = !attributes.hasValue(com.android.internal.R.styleable.Window_windowIsTranslucent) && attributes.getBoolean(com.android.internal.R.styleable.Window_windowSwipeToDismiss, false); final boolean isFloating = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false); return isFloating || isTranslucent || isSwipeToDismiss; } |
手头的 Android 8.1 的机器并没有触发这个问题,是因为这个问题在 8.1 里已经修复了。
解决方案
解决方法有如下几种:
-
降级
targetSDKVersion到26以下(废话!!) -
移除
mainfest文件里的screenOrientation属性 -
取消Activity主题里的
windowIsTranslucent属性或者windowSwipeToDismiss属性或者windowIsFloating属性(根据你设置了什么属性来具体分析) -
(推荐)移除
manifest文件里的screenOrientation属性,并在Activity的onCreate方法里设置屏幕方向
|
1 2 3 |
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } |
参考链接
解决 Only fullscreen opaque activities can request orientation

