【摘抄記錄問題】android小尺寸設(shè)備應(yīng)用無法全屏

版權(quán)聲明:本文為CSDN博主「尹中文」的原創(chuàng)文章蛹找,遵循CC 4.0 BY-SA版權(quán)協(xié)議膘滨,轉(zhuǎn)載請附上原文出處鏈接及本聲明筷狼。
原文鏈接:https://blog.csdn.net/yzwfeng/article/details/130148427

前言

進行公司車機設(shè)備開發(fā)時,由于屏幕比例比較特殊(1920x720)引润,導(dǎo)致部分應(yīng)用顯示時左側(cè)和底部有很大的黑邊宪赶,使用dumpsys分析黑邊的View宗弯,移除后發(fā)現(xiàn)仍存在,后確定為低版本默認(rèn)比例問題搂妻,耗費了幾個小時蒙保,記錄下這個問題。

出現(xiàn)問題的條件:

  1. Android 應(yīng)用:targetSdkVersion < 24 (Android N)欲主;
  2. 設(shè)備的分辨率寬高比大于1.86(1.86為Android低版本最大寬高比)邓厕;
  3. Android 應(yīng)用的AndroidManifest.xml內(nèi)未設(shè)置android:resizeableActivity="true"屬性;

問題解決方案

問題根據(jù)不同的情況有不同的解決方式

  1. 若擁有應(yīng)用源碼岛蚤,則可以直接將targetSdkVersion設(shè)置為大于等于24即可邑狸;
  2. 若擁有應(yīng)用源碼,但不能修改targetSdkVersion版本涤妒,那么就在
    應(yīng)用的AndroidManifest.xml內(nèi)設(shè)置android:resizeableActivity="true"屬性单雾;
  3. 若擁有應(yīng)用源碼,但不能修改targetSdkVersion版本,但compileSdkVersion=26時硅堆,
    可以嘗試在的AndroidManifest.xml內(nèi)設(shè)置android:maxAspectRatio=""="寬高比"屬性屿储;
  4. 若沒有應(yīng)用源碼,則需要嘗試修改系統(tǒng)層來達到適配的作用渐逃,具體修改見如下代碼:

系統(tǒng)層修改

/frameworks/base/core/java/android/content/pm/PackageParser.java
PackageParser在解析APK的AndroidManifest.xml文件時够掠,有如下代碼:

public class PackageParser {
    ....
    private static final float DEFAULT_PRE_O_MAX_ASPECT_RATIO = 1.86f;
    ....
    private boolean parseBaseApplication(Package owner, Resources res,
            XmlResourceParser parser, int flags, String[] outError)
            throws XmlPullParserException, IOException {
        final ApplicationInfo ai = owner.applicationInfo;
        final String pkgName = owner.applicationInfo.packageName;
        
        TypedArray sa = res.obtainAttributes(parser,
                com.android.internal.R.styleable.AndroidManifestApplication);
        ....
        
        // 這里會去判斷xml內(nèi)是否有設(shè)置android:resizeableActivity屬性
        if (sa.hasValueOrEmpty(R.styleable.AndroidManifestApplication_resizeableActivity)) {
            if (sa.getBoolean(R.styleable.AndroidManifestApplication_resizeableActivity, true)) {
                // 設(shè)置該標(biāo)志位后,應(yīng)用的Activity可調(diào)整大小
                ai.privateFlags |= PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
            } else {
                // 設(shè)置該標(biāo)志位后茄菊,應(yīng)用的Activity不可調(diào)整大小
                ai.privateFlags |= PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE;
            }
        } else if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.N) {
            // 若應(yīng)用未設(shè)置android:resizeableActivity屬性疯潭,且其targetSdkVersion >= Android N (24)
            // 設(shè)置該標(biāo)志位后,應(yīng)用的Activity可調(diào)整大小
            ai.privateFlags |= PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
-       }
+        }else {
+            ai.privateFlags |= PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
+        }
      
    }
    
}

根據(jù)以上代碼可以看到面殖,默認(rèn)情況下沒有對未設(shè)置android:resizeableActivity屬性竖哩,且targetSdkVersion < 24的應(yīng)用不會設(shè)置其Activity可調(diào)整大小,所以我們需要為這種情況加上對應(yīng)的配置脊僚,即添加上述代碼中的相應(yīng)內(nèi)容相叁。修改后編譯進設(shè)備,即可看到應(yīng)用全屏顯示了辽幌。

問題分析

除了上面分析到的沒有Activity可調(diào)整大小標(biāo)志位導(dǎo)致的無法全屏問題增淹,還有一個是關(guān)于默認(rèn)最大寬高比(DEFAULT_PRE_O_MAX_ASPECT_RATIO)的問題,通過修改該值也可以實現(xiàn)應(yīng)用的全屏乌企,不過有時候屏幕比例變化較大時該值可能要經(jīng)常改動虑润,有點麻煩。下面主要是從源碼來分析下該值是如何起作用的逛犹。
/frameworks/base/core/java/android/content/pm/PackageParser.java

public class PackageParser {
    ....
    private static final float DEFAULT_PRE_O_MAX_ASPECT_RATIO = 1.86f;
    ....    
    private void setMaxAspectRatio(Package owner) {
        // 對于 O 之前的應(yīng)用程序默認(rèn)為 (1.86) 16.7:9 縱橫比端辱,對于 O 及更高版本則未設(shè)置梁剔。
        float maxAspectRatio = owner.applicationInfo.targetSdkVersion < O
                ? DEFAULT_PRE_O_MAX_ASPECT_RATIO : 0;
 
        if (owner.applicationInfo.maxAspectRatio != 0) {
            // 如果應(yīng)用設(shè)置了android:maxAspectRatio 屬性值虽画,則使用應(yīng)用程序所配置的最大寬高比。
            maxAspectRatio = owner.applicationInfo.maxAspectRatio;
        } else if (owner.mAppMetaData != null
                && owner.mAppMetaData.containsKey(METADATA_MAX_ASPECT_RATIO)) {
            // 未設(shè)置則設(shè)置為默認(rèn)的1.86
            maxAspectRatio = owner.mAppMetaData.getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio);
        }
 
        for (Activity activity : owner.activities) {
            // If the max aspect ratio for the activity has already been set, skip.
            if (activity.hasMaxAspectRatio()) {
                continue;
            }
 
            // 這里可以獲取activity設(shè)置的maxAspectRatio屬性荣病,若應(yīng)用和activity都設(shè)置了码撰,則以activity的優(yōu)先
            final float activityAspectRatio = activity.metaData != null
                    ? activity.metaData.getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio)
                    : maxAspectRatio;
            // 將最大寬高比設(shè)置給activity
            activity.setMaxAspectRatio(activityAspectRatio);
        }
    }
}

以上就是為何應(yīng)用無法全屏顯示的原因,以及另外一種修改為何也能生效的原因个盆。
————————————————
版權(quán)聲明:本文為CSDN博主「尹中文」的原創(chuàng)文章脖岛,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明颊亮。
原文鏈接:https://blog.csdn.net/yzwfeng/article/details/130148427

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柴梆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子终惑,更是在濱河造成了極大的恐慌绍在,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偿渡,居然都是意外死亡臼寄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門溜宽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吉拳,“玉大人,你說我怎么就攤上這事适揉×粼埽” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵嫉嘀,是天一觀的道長稼跳。 經(jīng)常有香客問我,道長吃沪,這世上最難降的妖魔是什么汤善? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮票彪,結(jié)果婚禮上红淡,老公的妹妹穿的比我還像新娘。我一直安慰自己降铸,他們只是感情好在旱,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著推掸,像睡著了一般桶蝎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谅畅,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天登渣,我揣著相機與錄音,去河邊找鬼毡泻。 笑死胜茧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仇味。 我是一名探鬼主播呻顽,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丹墨!你這毒婦竟也來了廊遍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤贩挣,失蹤者是張志新(化名)和其女友劉穎喉前,沒想到半個月后英染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡被饿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年四康,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭握。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡闪金,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出论颅,到底是詐尸還是另有隱情哎垦,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布恃疯,位于F島的核電站漏设,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏今妄。R本人自食惡果不足惜郑口,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盾鳞。 院中可真熱鬧犬性,春花似錦、人聲如沸腾仅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推励。三九已至鹤耍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間验辞,已是汗流浹背稿黄。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留受神,地道東北人抛猖。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓格侯,卻偏偏與公主長得像鼻听,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子联四,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容