Android菜鸟之学习android源码之三(修改系统默认横屏)
2017-01-24 16:19
483 查看
好多小伙伴在开发平板产品的时候都会接到把系统默认竖屏改成默认横屏的任务,网上查了许多的文章,有说改底层的c++文件的,有说改系统编译出来的一些配置文件的,众说纷纭,我当初也踩过了不少的坑,最终发现一种比较靠谱的方式,那就是修改WindowManagerService,这个类是位于framework里的,修改后需要对整个framework进行模块编译后替换掉系统的framework.jar这个包,这个类的具体路径是
platform\frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.class
具体改动的地方看代码吧,
修改这几处代码便能把系统默认的竖屏变成横屏,但是会有其他的应用出现问题,比如拨号盘原本竖屏显示的,但是在这种横屏模式下打开拨号盘会报空指针错误,进源码一看原来拨号盘也准备了两套的布局,一套横屏一套竖屏的,单独修改windowmanagerservice后不知道为什么这些系统应用没有变成竖屏模式,或许是时间仓促,并没有对windowmanagerservice的流程作很详细的分析,以后有时间再找机会研究下这个流程吧。
platform\frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.class
具体改动的地方看代码吧,
public int getOrientationFromWindowsLocked() { .... -- return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); ++ return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
/* * Determine the new desired orientation of the display, returning * a non-null new Configuration if it has changed from the current * orientation. IF TRUE IS RETURNED SOMEONE MUST CALL * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE * SCREEN. This will typically be done for you if you call * sendNewConfiguration(). * * The orientation is computed from non-application windows first. If none of * the non-application windows specify orientation, the orientation is computed from * application tokens. * @see android.view.IWindowManager#updateOrientationFromAppTokens( * android.os.IBinder) */ boolean updateOrientationFromAppTokensLocked(boolean inTransaction) { long ident = Binder.clearCallingIdentity(); try { int req = getOrientationFromWindowsLocked(); if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { -- mForcedAppOrientation = req; -- req = getOrientationFromAppTokensLocked(); ++req=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } if (req != mForcedAppOrientation) { -- mForcedAppOrientation = req; ++ mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; .... }
boolean computeScreenConfigurationLocked(Configuration config) { .... if (config != null) { -- config.orientation = (dw <= dh) ? Configuration.ORIENTATION_PORTRAIT:Configuration.ORIENTATION_LANDSCAPE; ++ config.orientation = Configuration.ORIENTATION_LANDSCAPE; } .... return true; }
修改这几处代码便能把系统默认的竖屏变成横屏,但是会有其他的应用出现问题,比如拨号盘原本竖屏显示的,但是在这种横屏模式下打开拨号盘会报空指针错误,进源码一看原来拨号盘也准备了两套的布局,一套横屏一套竖屏的,单独修改windowmanagerservice后不知道为什么这些系统应用没有变成竖屏模式,或许是时间仓促,并没有对windowmanagerservice的流程作很详细的分析,以后有时间再找机会研究下这个流程吧。
相关文章推荐
- Android菜鸟之学习android源码之四(修改系统默认字体尺寸)
- Android菜鸟之学习android源码之二(SystemUI导航栏初步认识及修改)
- Android源码学习之八—系统启动过程
- Android源码学习之八—系统启动过程
- Android不改Framework代码修改系统默认屏幕亮度
- Android系统移植与调试之------->如何修改Android设备的默认休眠时间
- Android framework系统默认设置修改
- Android源码中修改默认语言 及 定制多语言
- android编译中修改默认的系统应用
- Android framework系统默认设置修改
- 修改Tiny6410Android系统的开机默认设置
- Android系统移植与调试之------->如何修改Android的默认语言、默认时区
- Android framework系统默认设置修改
- Android framework系统默认设置修改
- Android修改系统的默认日期(Spreadturm)
- Android源码学习之八—系统启动过程
- Android源码学习之八—系统启动过程
- android 中对 gps 默认关闭+语言默认中文的设置+时区设置+修改系统名字+修改系统默认时间+修改屏幕休眠时间
- Android 修改默认系统Acitity背景
- 修改系统默认屏幕显示方向横屏或竖屏