Android 9.0 USER_ROTATION重启恢复问题分析

Android 9.0 USER_ROTATION重启恢复问题分析

摘要:

最近MTK平台 9.0系统中,遇到System签名APK 使用方法“System.putInt(contentResolver, “user_rotation”, rotation);” 调整屏幕方向时,重启后方向总恢复默认方向的问题。

问题原因:

MtkSystemUI 的一个 NavigationBarFragment初始化时,重新设置了user_rotation

调整方向:

    protected void setScreenRotation(int rotation) {
        ContentResolver contentResolver = this.mActivity.getContentResolver();
        try {
            if (System.getInt(contentResolver, "accelerometer_rotation", 0) != 0) {
                System.putInt(contentResolver, "accelerometer_rotation", 0);
            }
        } catch (Exception e) {
        }
        try {
            if (rotation != System.getInt(contentResolver, "user_rotation", 0)) {
                System.putInt(contentResolver, "user_rotation", rotation);
            }
        } catch (Exception e2) {
        }
    }


简陋的思维导图

花时间找到一个修改的方案:
以下是个人最近使用Xmind制作的一个 9.0系统 每次重启user_rotation的值都会重置,问题分析应该重下往上逐步找到问题出现的起始点。
流程图:

Android 9.0 USER_ROTATION重启恢复问题分析_第1张图片

思维导图说明

以下内容是使用xmind 导出思维导图的 md文件,再导入CSDN自动生成

SystemUI

位置:frameworks/base/packages/SystemUI/

NavigationBarFragment.java

onCreate()初始化

NavigationBarFragment 中通过调用 RotationLockController 的函数

setRotationLockedAtAngle 传入参数

  • onCreate


** 接口类:RotationLockController.java**

  • setRotationLockedAtAngle


RotationLockControllerImpl.java

实现RotationLockController接口

实现 setRotationLockedAtAngle

  • setRotationLockedAtAngle


RotationPolicy

位置:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java

  • setRotationLockAtAngle

  • setRotationLock
    此函数通过AsyncTask 调用 WMS 的函数freezeRotation 固定屏幕方向


windowManagerService

位置:
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

  • freezeRotation
    固定屏幕旋转


PhoneWindowManager

  • setUserRotationMode
    这个函数的主要作用,是把 rotation重新 put到 SettingsProvider中,这时所有的ContentObserver

你可能感兴趣的:(android,java,开发语言)