美文网首页
Android 8.0系统 Only fullscreen o

Android 8.0系统 Only fullscreen o

作者: AnyunBo | 来源:发表于2020-12-29 14:28 被阅读0次

    最近在华为8.0系统的手机中遇到Only fullscreen opaque activities can request orientation

    Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
    at android.app.Activity.onCreate(Activity.java:1081)
    at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
    at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:149)
    at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:313)
    at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:106)
    at com.secoo.commonsdk.components.TrackableActivity.onCreate(TrackableActivity.kt:45)
    at com.secoo.commonsdk.arms.base.BaseActivity.onCreate(BaseActivity.java:124)
    at com.secoo.livevod.live.activity.LiveMoreDrawActivity.onCreate(LiveMoreDrawActivity.kt:48)
    at android.app.Activity.performCreate(Activity.java:7383)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
    at com.qiyukf.unicorn.m.a.callActivityOnCreate(QiyuInstrumentation.java:258)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)
    at android.app.ActivityThread.-wrap12(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994)
    at android.os.Handler.dispatchMessage(Handler.java:108)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7529)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
    

    一、 出现的场景

    • Android 8.0
    • Activity透明
    • targetSdkVersion 27

    二、解决方法

    第一种解决方法

    移除manifest中的Activity对应的android:screenOrientation="portrait"
    如果需要使用android:screenOrientation="portrait"则可在对应的ActivityonCreate中添加:

     //android O fix bug orientation
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    
    第二种解决方法
    • 1.找到你设置透明的Activity,然后在他的theme中将android:windowIsTranslucent改为false
      eg:<item name="android:windowIsTranslucent">false</item>

      1. 再加入<item name="android:windowDisablePreview">true</item>就搞定了。

    三、原因(源码中寻找)

    3.1 、 ActivityRecord#setRequestedOrientation
    1.jpeg

    有几个条件:

    • 非全屏!fullscreen
    • targetSdkVersion的设置为大于26 appInfo.targetSdkVersion > O
    • ActivityInfo.isFixedOrientation(requestedOrientation)

    所以下边来跟踪一下ActivityInfo.isFixedOrientation(requestedOrientation)

    3.2 、跟踪ActivityInfo.isFixedOrientation(requestedOrientation)
    2.png

    继续跟踪isFixedOrientationPortrait(int orientation)

    3.png

    最后的原因找到了是因为orientation == SCREEN_ORIENTATION_PORTRAIT
    这种情况下,透明Activity使用的是栈中,上一层可见Activity的orientation设定

    相关文章

      网友评论

          本文标题:Android 8.0系统 Only fullscreen o

          本文链接:https://www.haomeiwen.com/subject/yojfoktx.html