Android O 竖屏横用相关修改

本文围绕Android设备竖屏横用展开,介绍了需考虑的方面,包括kernel_logo、bootanimation、系统、锁屏和Launcher等。详细说明了各部分的修改方法,如替换图片、修改代码文件等,还提及系统自动旋转功能的调整及锁屏和Launcher旋转设置,为相关开发提供参考。

最近公司想要做个横屏的设备,考虑到是小屏,LCM由于工艺,防摔等因素不好替换,Manager让研究下竖屏横用。

需要考虑的方面:

kernel_logo,bootanimation,系统,recovery ui,charger (关机充电)等。

1.kernel_logo

qualcomm的kernel_logo在splash.img里

目录:

vendor\action\splash\android_720X1280.png,替换成横屏的

2.bootanimation

frameworks\base\cmds\bootanimation\BootAnimation.cpp

status_t BootAnimation::readyToRun() {
    ...
    mAssets.addDefaultAssets();

    sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
            ISurfaceComposer::eDisplayIdMain));
    DisplayInfo dinfo;
    status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
    if (status)
        return -1;
   //potter add
    int temp = dinfo.h;
    dinfo.h= dinfo.w;
    dinfo.w= temp;
    Rect destRect(dinfo.w, dinfo.h);
    mSession->setDisplayProjection(dtoken, 1, destRect, destRect);//orient=1
   //potter end
    ...
}

device\honeywell\common\bootanimation.zip

每张图都替换成横屏的。这里要注意下,由于前面BootAnimation.cpp做了顺时针90度处理,所以这里的图片需要在kernel_logo的这种处理方法上再逆时针转个90度。为什么BootAnimation.cpp中做顺时针90度处理,是因为后面上层的WMS里面预设角度从0变成90度了(android N是在WMS修改的,而Android O是在DisplayContent里面)。如果不处理,WMS起来的时候,bootanimation还没走完,剩下的一小段的bootanimation会转个90度,会不一致。(这个大家可以实际测试看看效果)

重编或者adb push 到system/media目录,然后重启手机看效果。

3.系统

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

public int rotationForOrientationLw(int orientation, int lastRotation) {
    ...
    default:
    // For USER, UNSPECIFIED, NOSENSOR, SENSOR and FULL_SENSOR,
    // just return the preferred orientation we already calculated.
    if (preferredRotation >= 0) {
        return preferredRotation;
    }
    //potter change
    //return Surface.ROTATION_0;
    return Surface.ROTATION_90;
    //potter end
    ...
}

 frameworks\base\services\core\java\com\android\server\wm\DisplayContent.java

//potter change 
//private int mRotation = 0;
private int mRotation = 1;
//potter end

这两处修改后,进入系统就已经是默认横屏了。

但是要考虑一个问题,systemui里面有自动旋转的功能。这个QSTile打开,那么是自动旋转,可以横竖屏切换,关闭就锁定竖屏了。

这显然不是我们想要的。由于我们现在是竖屏横用,所以我们希望是QSTile打开,自动旋转,关闭的话锁定横屏。所以有了下面两处的修改。

frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tiles\RotationLockTile.java

public static boolean isCurrentOrientationLockPortrait(RotationLockController controller,
        Context context) {
	//potter change
	return false;
	/*
    int lockOrientation = controller.getRotationLockOrientation();
    if (lockOrientation == Configuration.ORIENTATION_UNDEFINED) {
        // Freely rotating device; use current rotation
        return context.getResources().getConfiguration().orientation
                != Configuration.ORIENTATION_LANDSCAPE;
    } else {
        return lockOrientation != Configuration.ORIENTATION_LANDSCAPE;
    }
	*/
	//potter end
}

其实这里直接返回false有点粗暴,可能会有隐患,有兴趣的朋友可以深入研究下看怎么优雅点。

frameworks\base\core\java\com\android\internal\view\RotationPolicy.java

//potter change 
//private static final int NATURAL_ROTATION = Surface.ROTATION_0;
private static final int NATURAL_ROTATION = Surface.ROTATION_90;
//potter end

如果完全不需要自动旋转这个功能。那么在

\frameworks\base\core\res\res\values\config.xml

<bool name="config_supportAutoRotation">true</bool>

改成false。这样就不能自动旋转了,但是你需要自己去systemui中把自动旋转的qstile remove掉,要不ui还在。

4.关于锁屏和Launcher

我们知道,默认锁屏和Launcher是不能自动旋转的。

其实也是可以设置的,针对锁屏:

frameworks\base\core\res\res\values\config.xml

<bool name="config_enableLockScreenRotation">false</bool>

改成true就行。

针对Laucher:

从Android N开始:

桌面空白处长按→进入OverviewMode→点击设置→打开允许旋转的开关

实际Android 默认是有这个功能的。只是默认在手机上没打开,大的平板还是打开了的。

packages/apps/Launcher3/res/xml/launcher_preferences.xml:43:        android:defaultValue="@bool/allow_rotation"

packages/apps/Launcher3/res/values/config.xml:10:    <bool name="allow_rotation">false</bool>

packages/apps/Launcher3/res/values-sw600dp/config.xml:3:    <bool name="allow_rotation">true</bool>

如果想要默认打开:

packages/apps/Launcher3/res/values/config.xml

<bool name="allow_rotation">false</bool>

改成true即可。

 

recovery ui和charger暂时还没研究到,后头补充。希望对大家有用。

<think>嗯,用户想让Android设备的锁屏界面固定为横屏显示。这听起来有点挑战,因为通常系统会根据设备方向自动旋转,但锁屏界面可能默认跟随系统设置或者有其他逻辑。首先,我需要回忆一下Android系统中锁屏相关的组件和配置。 我记得锁屏界面主要由SystemUI模块处理,特别是Keyguard相关的部分。修改系统级的行为可能需要调整WindowManager或者PhoneWindowManager的配置。用户提到的引用里提到修改PhoneWindowManager.java,这可能涉及到设置屏幕方向的地方。比如,在PhoneWindowManager中,有一个方法可能控制着锁屏时的方向,比如getRotationLockOrientation或者某个处理屏幕旋转的逻辑。 另外,用户提供的引用中有解决横屏锁屏后显示异常的案例,这说明直接设置横屏可能会引发界面布局的问题,比如重复绘制或者布局错乱。这时候可能需要调整布局文件,确保横屏下的锁屏界面适配正确。例如,检查res/layout和res/layout-land中的布局文件,或者强制锁屏界面使用横屏布局。 还有,引用3提到锁屏时Activity的onDestroy被调用,导致黑屏。这可能是因为屏幕方向改变导致Activity重建。如果锁屏界面是Activity,固定横屏可能需要设置Activity的screenOrientation属性为landscape,或者使用configChanges来防止重启。不过锁屏界面可能属于系统应用,需要修改系统代码,比如在AndroidManifest.xml中设置相关属性。 另外,考虑系统服务,比如WindowManagerService,里面可能有控制屏幕旋转的逻辑。例如,截屏保存屏幕状态的部分,可能在屏幕旋转动画中锁定方向。用户引用5提到截屏保存屏幕状态,这可能涉及到WindowManagerService的screenRotationAnimation方法,或许在这里可以强制设置横屏。 可能的步骤是:1. 修改PhoneWindowManager.java中的锁屏方向设置,强制返回横屏方向。2. 在锁屏的Activity或布局中设置横屏属性,防止自动旋转。3. 处理可能引起的界面异常,比如调整布局或禁止方向传感器。4. 需要系统签名权限,因为涉及系统级修改。 不过,用户可能没有系统源码的修改权限,如果是开发自定义ROM,那需要重新编译系统。另外,不同Android版本可能有差异,比如Android O和更高版本的实现可能不同,需要检查对应的代码路径。 可能遇到的问题:锁屏界面横屏后,解锁进入系统时如果设备是屏,可能会有旋转动画的问题,或者界面显示异常。需要测试不同场景下的表现,并做相应调整。此外,系统升级后可能需要重新应用这些修改,维护成本较高。 总结下来,解决方案需要修改系统服务中的屏幕方向控制,调整锁屏界面的布局和配置,并处理可能引发的Activity生命周期问题。需要具体查看相关系统模块的代码,找到控制锁屏方向的关键点进行修改。</think>### Android锁屏界面固定横屏解决方案 #### 一、核心实现原理 1. 锁屏界面方向由WindowManagerServicePhoneWindowManager共同控制,需修改系统级屏幕方向配置[^1][^5] 2. 需强制锁定Keyguard(锁屏界面)的显示方向,禁止响应设备旋转传感器 3. 需要处理Activity生命周期与方向变化的关联问题[^3] #### 二、具体实现步骤(需系统签名权限) 1. **修改PhoneWindowManager.java** ```java // 在updateRotationLocked方法中添加方向锁定判断 public void updateRotationLocked(boolean enabled, int rotation) { if (mKeyguardDelegate.isShowing()) { // 判断锁屏状态 mOrientationListener.setCurrentRotation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); return; } // 原处理逻辑... } ``` 2. **强制设置锁屏方向(Android O示例)** ```java // 在KeyguardViewMediator.java中添加方向设置 private void adjustKeyguardLayout() { WindowManager.LayoutParams lp = mKeyguardWindow.getAttributes(); lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; mWindowManager.updateViewLayout(mKeyguardHost, lp); } ``` 3. **修改锁屏布局文件** ```xml <!-- 在res/layout-land/keyguard.xml中添加 --> <LinearLayout android:orientation="horizontal" android:screenOrientation="landscape" android:configChanges="orientation|screenSize"> <!-- 锁屏界面组件 --> </LinearLayout> ``` #### 三、注意事项 1. **界面适配**:需同时提供横屏布局资源`layout-land`和`drawable-land`[^4] 2. **生命周期处理**:添加`android:configChanges`属性防止锁屏Activity重建 3. **传感器屏蔽**:在DevicePolicyManager中禁用方向传感器 ```java devicePolicyManager.setSecureSetting(componentName, Settings.System.ACCELEROMETER_ROTATION, 0); ``` #### 四、效果验证 1. 通过`adb shell dumpsys window`查看当前窗口方向 2. 测试不同物理方向下的锁屏显示 3. 验证解锁后的界面恢复逻辑
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值