Android8.X異常之Only fullscreen opaque activities can request orientation

前言

這幾天在Sentry上發(fā)現(xiàn)了1個(gè)從未見過的異常
java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
印象中從未遇到過這個(gè)問題烘挫,但也一時(shí)覺得莫名其妙,經(jīng)過查證是只有Android8.X版本才會(huì)出現(xiàn)的bug,而且估計(jì)很少有人遇到饮六,既然自己解決了也就把怎么解決的說一下其垄。

bug.png

產(chǎn)生原因

簡單來說滿足3個(gè)條件時(shí)會(huì)報(bào)這個(gè)異常
1)當(dāng)前Activity是否固定了方向,例如android:screenOrientation="portrait"
2)當(dāng)前Activity的主題是否設(shè)置了如下的屬性:
windowIsTranslucent為true
windowIsTranslucent為false卤橄,但windowSwipeToDismiss為true
windowIsFloating為true
3)項(xiàng)目的targetSdkVersion是否為26或27即Android8.X版本
當(dāng)滿足以上條件你又去打開那個(gè)Activity绿满,這個(gè)bug就會(huì)如約而至

解決方案

這里就直接上代碼吧

/**
 * 修復(fù)Android8.X存在的java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation問題
 * 在Activity中onCreate()中super之前調(diào)用
 *
 * @author yzt 2020/6/30
 */
public class ActivityOrientationHook {

    public static void hook(Activity activity) {
        if (activity == null)
            return;

        //目標(biāo)版本8.X
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1
                && Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
            if (isTranslucentOrFloating(activity)) {
                fixOrientation(activity);
            }
        }
    }

    /**
     * 檢查屏幕是否固定,橫豎屏或者鎖定就是固定的
     */
    private static boolean isTranslucentOrFloating(Activity activity) {
        boolean isTranslucentOrFloating = false;
        try {
            Class<?> styleableClass = Class.forName("com.android.internal.R$styleable");
            Field WindowField = styleableClass.getDeclaredField("Window");
            WindowField.setAccessible(true);
            int[] styleableRes = (int[]) WindowField.get(null);
            //先獲取到TypedArray
            final TypedArray typedArray = activity.obtainStyledAttributes(styleableRes);
            Class<?> ActivityInfoClass = ActivityInfo.class;
            //調(diào)用檢查是否屏幕旋轉(zhuǎn)
            Method isTranslucentOrFloatingMethod = ActivityInfoClass.getDeclaredMethod("isTranslucentOrFloating", TypedArray.class);
            isTranslucentOrFloatingMethod.setAccessible(true);
            isTranslucentOrFloating = (boolean) isTranslucentOrFloatingMethod.invoke(null, typedArray);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isTranslucentOrFloating;
    }

    /**
     * 設(shè)置屏幕不固定窟扑,繞過檢查
     */
    private static void fixOrientation(Activity activity) {
        try {
            Class<Activity> activityClass = Activity.class;
            Field mActivityInfoField = activityClass.getDeclaredField("mActivityInfo");
            mActivityInfoField.setAccessible(true);
            ActivityInfo activityInfo = (ActivityInfo) mActivityInfoField.get(activity);
            //設(shè)置屏幕不固定
            activityInfo.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

然后在對(duì)應(yīng)的Activity中這么使用即可

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ActivityOrientationHook.hook(this);
        super.onCreate(savedInstanceState);
    }

解決思路就是判斷targetSdkVersion版本喇颁,如果為8.X版本則不固定方向,來達(dá)到規(guī)避這個(gè)異常的目的嚎货。由于這個(gè)問題在9.0及以上的版本已經(jīng)解決橘霎,所以這里只要判斷一下是否是8.X版本即可。

在此感謝

https://blog.csdn.net/na2609613672/article/details/89403053
http://www.reibang.com/p/8328a586f9de

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殖属,一起剝皮案震驚了整個(gè)濱河市姐叁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洗显,老刑警劉巖外潜,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挠唆,居然都是意外死亡处窥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門玄组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碧库,“玉大人,你說我怎么就攤上這事巧勤∏痘遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颅悉,是天一觀的道長沽瞭。 經(jīng)常有香客問我,道長剩瓶,這世上最難降的妖魔是什么驹溃? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮延曙,結(jié)果婚禮上豌鹤,老公的妹妹穿的比我還像新娘。我一直安慰自己枝缔,他們只是感情好布疙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布蚊惯。 她就那樣靜靜地躺著,像睡著了一般灵临。 火紅的嫁衣襯著肌膚如雪截型。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天儒溉,我揣著相機(jī)與錄音宦焦,去河邊找鬼。 笑死顿涣,一個(gè)胖子當(dāng)著我的面吹牛波闹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涛碑,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼精堕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锌唾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤夺英,失蹤者是張志新(化名)和其女友劉穎晌涕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痛悯,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡余黎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了载萌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惧财。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扭仁,靈堂內(nèi)的尸體忽然破棺而出垮衷,到底是詐尸還是另有隱情,我是刑警寧澤乖坠,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布搀突,位于F島的核電站,受9級(jí)特大地震影響熊泵,放射性物質(zhì)發(fā)生泄漏仰迁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一顽分、第九天 我趴在偏房一處隱蔽的房頂上張望徐许。 院中可真熱鬧,春花似錦卒蘸、人聲如沸雌隅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澄步。三九已至冰蘑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間村缸,已是汗流浹背祠肥。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯皿,地道東北人仇箱。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像东羹,于是被迫代替她去往敵國和親剂桥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354