【问题标题】:getting the "pointer" to NavigationBarView.java by reflection通过反射获得指向 NavigationBarView.java 的“指针”
【发布时间】:2017-06-28 01:00:37
【问题描述】:

我正在尝试在使用旧 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);

然而,这还不够。我想深入了解导航栏可绘制对象。

非常感谢任何线索。

谢谢。

附:由于它是嵌入式系统,所以如果我更改操作系统就可以了,因为它永远不会出现在 Google 商店中。

【问题讨论】:

  • 你试过了吗(stackoverflow.com/questions/1196192/…)?
  • 我知道如何通过反射获得东西,这不是问题所在。我想通过反射获得导航栏指针,这是主要问题。感谢您在所有情况下阅读。

标签: java android reflection navigationbar


【解决方案1】:

无法通过反射获取PhoneStatusBar 中的mNavigationBarView 对象。 此对象存在于进程com.android.systemui,您自己的进程无法使用反射访问另一个进程的对象。

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

已经有一些模块修改了navigationBar,例如:Xperia/AOSP NavBar Buttons 。你可以按照这个教程modify SystemUI's clock style using Xposed framework

【讨论】:

  • 如果做不到,他们是怎么做的?我相信这是可能的,这只是重新构建并导入正确的 .jar 的问题。
  • @gmmo 反射不可能。使用 Xposed 框架是可能的,它的钩子在 SystemUI 的进程中运行,因此您可以访问 mNavigationBarView 对象并做任何您想做的事情。另一种方法是反编译 SystemUI.apk 并修改 smali 文件(反编译的源代码文件),然后重新编译并使用平台密钥签名 apk。您可能没有密钥,因此您需要反编译和修改 services.jar 以信任您自己的密钥。这很复杂但可能,我以前做过这样的事情。 xposed框架和修改apk都需要root设备。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多