通过反射获取NavigationBarView.java的“指针”

我试图在使用旧
Android操作系统的嵌入式系统的导航栏上以编程方式更改一些内容.我缩小到处理下面导航栏的班级.

https://android.googlesource.com/platform/frameworks/base/+/7d8abae/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java

该对象似乎在这里声明:

https://android.googlesource.com/platform/frameworks/base/+/598a7aedfb6b77fc98bace9f420968a6f3ed637e/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

第238行

私有NavigationBarView mNavigationBarView = null;

有没有办法以编程方式获取指向此对象的指针?我唯一能找到的代码是获取更大容器的代码,就像以编程方式隐藏导航栏一样.

        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);

然而,这还不够.我想深入到navbar drawables.

任何线索都非常感谢.

谢谢.

附:由于它是一个嵌入式系统,所以如果我改变操作系统是好的,因为它永远不会在谷歌商店.

最佳答案 通过反射无法在PhoneStatusBar中获取mNavigationBarView对象.

这个对象生活在进程com.android.systemui中,你自己的进程无法使用反射访问另一个进程的对象.

一种可能的方法是使用Xposed框架.通过PhoneStatusBar方法中的一些挂钩,您可以访问mNavigationBarView对象.

已经有一些模块可以修改navigationBar,例如:Xperia/AOSP NavBar Buttons .您可以按照本教程modify SystemUI’s clock style using Xposed framework进行操作.

点赞