这段时间把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