Android6.0設置開機啓動默認橫屏併兼顧自動旋轉功能

       關於Android6.0開機默認橫屏顯示,網上有一些文章提到過,但是我仔細研究了下,要麼不全,要麼修改方式會引入新的問題。爲了讓開機強制橫屏顯示,並且又不影響sensor的屏幕自動旋轉功能,我對旋轉的修改方式做了很多嘗試,最後終於找到了一種可行的方式。既保證開機啓動的時候按照指定的方向顯示logo和開機動畫,又可以在打開自動旋轉開關後,通過轉動設備來自動旋轉屏幕。具體做法如下:

開機默認橫屏顯示,需要修改幾個部分,包括bootloader,開機動畫,SurfaceFlinger以及進入桌面後的Launcher顯示方向。

1. bootloader

    不同的平臺,bootloader的顯示部分有差異,可以根據平臺的代碼特點去修改,比如調換x、y的數據。

2. 開機動畫

    開機動畫主要修改BootAnimation.cpp -> readyToRun ()

    if (dinfo.w < dinfo.h)
        control = session()->createSurface(String8("BootAnimation"),
            dinfo.h, dinfo.w, PIXEL_FORMAT_RGB_565);
    else
        control = session()->createSurface(String8("BootAnimation"),
            dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);

3. SurfaceFlinger

    SurfaceFlinger部分主要修改DisplayDevice.cpp -> DisplayDevice() 最後一行:

    if (!strcmp(property, "DT370CR"))
            rotate_default = DisplayState::eOrientation270;
        else if (!strcmp(property, "DT317CR"))
            rotate_default = DisplayState::eOrientation90;

    setProjection(rotate_default, mViewport, mFrame);

    然後進入setProjection()裏面進行如下修改:

    if (!frame.isValid()) {
        // the destination frame can be invalid if it has never been set,
        // in that case we assume the whole display frame.
        if (w < h)
            frame = Rect(h, w);  //此處調換x、y順序,若不調換,開機動畫前半段會有偏移
        else
            frame = Rect(w, h);
    }

4. Framework

    (1) WindowManagerService.java

    修改四個變量的初始值:

        int mRotation = ("DT370CR".equals(Build.MODEL))?3:(("DT317CR".equals(Build.MODEL))?1:0);
        int mForcedAppOrientation = ("DT370CR".equals(Build.MODEL))?8:(("DT317CR".equals(Build.MODEL))?0:-1);

        int mLastWindowForcedOrientation = ("DT370CR".equals(Build.MODEL))?8:(("DT317CR".equals(Build.MODEL))?0:-1);
        int mLastKeyguardForcedOrientation = ("DT370CR".equals(Build.MODEL))?8:(("DT317CR".equals(Build.MODEL))?0:-1);

    修改boolean updateOrientationFromAppTokensLocked(boolean inTransaction),增加下面一段:

            if (req == 5)
                    req = ("DT370CR".equals(Build.MODEL))?8:(("DT317CR".equals(Build.MODEL))?0:5);

    (2) PhoneWindowManager.java

    修改一個變量的初始值:

            int mUserRotation = (("DT370CR".equals(Build.MODEL))?3:(("DT317CR".equals(Build.MODEL))?1:0));

    修改public void updateSettings(),給userRotation重新賦值,增加如下一段代碼:

            int userRotation = Settings.System.getIntForUser(resolver,
                    Settings.System.USER_ROTATION,
                    (("DT370CR".equals(Build.MODEL))?3:(("DT317CR".equals(Build.MODEL))?1:0)),
                    UserHandle.USER_CURRENT);
            if (userRotation < 0) {
                userRotation = (("DT370CR".equals(Build.MODEL))?3:(("DT317CR".equals(Build.MODEL))?1:0));
            }

    修改public int rotationForOrientationLw(int orientation, int lastRotation)如下:

        if (mForceDefaultOrientation) {
            if ("DT370CR".equals(Build.MODEL))
                return Surface.ROTATION_270;
            else if ("DT317CR".equals(Build.MODEL))
                return Surface.ROTATION_90;
            else
                return Surface.ROTATION_0;
        }

(3) ~/framework/base/packages/SettingsProvider/res/values/defaults.xml

    將def_user_rotation的值修改爲-1

至此,所有代碼修改完畢,重新編譯代碼,燒錄固件後會發現屏幕已經橫過來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章