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