欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java.lang.IllegalStateException: Only fullscreen activities can request orientation异常的解决办法,

来源: javaer 分享于  点击 21676 次 点评:147

java.lang.IllegalStateException: Only fullscreen activities can request orientation异常的解决办法,


出现的异常:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.glority.receipt/cn.glority.receipt.wxapi.WXEntryActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2858)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2933)
 at android.app.ActivityThread.-wrap11(Unknown Source)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1612)
 at android.os.Handler.dispatchMessage(Handler.java:105)
 at android.os.Looper.loop(Looper.java:164)
 at android.app.ActivityThread.main(ActivityThread.java:6710)
 at java.lang.reflect.Method.invoke(Method.java)
 at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

出现的位置是微信SDK的回调Activity,之前它在Manifest中的定义是:

  

基本的意思是说,“fullscreen”为否的activity是不能锁定orientation的,否则抛出异常。

如果一个Activity的Style符合下面三个条件之一,认为不是“fullscreen”:

“windowIsTranslucent”为true;
“windowIsTranslucent”为false,但“windowSwipeToDismiss”为true;
“windowIsFloating“为true;

这个限制的目的是想阻止非全屏的Activity锁定屏幕旋转,因为当前Activity是透明的,浮动的或可滑动取消的,是否锁屏应该由全屏的Activity决定,而不是并没有全部占据屏幕的Activity决定。

这个问题貌似在最新的SDK中已经修复,我们在API Level 27的设备上已经无法重现,但我们手头的API Level 26的设备还是能重现。而且根据上面的代码来看,如果想保留当前Activity的style,“isTranslucentOrFloating”的逻辑根本没法绕过,所以想绕开很难,目前能想到的大概两个方向:

推迟SDK升级,等官方修复被大多数设备采用; 升级SDK,但重构一下代码,看看已有的非“fullscreen” Activity是不是都是必要的,例如用Fragment实现周围半透明效果,能不能直接把Fragment加入到当前Activity(当然Detach Fragment是有重绘View的开销的)。

我这里的解决方式是:

1. 把true换成false

2. 移除manifest中的android:screenOrientation="portrait"

相关栏目:

用户点评