【发布时间】:2016-05-14 22:07:06
【问题描述】:
有没有办法在 Android 应用中访问android.net.EthernetManager? Class.forName("android.net.ethernet.EthernetManager") 和 Class.forName("android.net.EthernetManager") 都会生成 ClassNotFoundException。
【问题讨论】:
有没有办法在 Android 应用中访问android.net.EthernetManager? Class.forName("android.net.ethernet.EthernetManager") 和 Class.forName("android.net.EthernetManager") 都会生成 ClassNotFoundException。
【问题讨论】:
似乎android.net.EthernetManager 是一个隐藏类,Javadoc 将其标记为@hide。可通过here定制的SDK平台访问,无需root设备。
Android Hidden API library是一个修改过的jar文件,它结合了Android SDK的android.jar和真实设备的framework.jar。此 jar 使您能够在开发中使用 Android 内部/隐藏 API。
什么是 Android 内部和隐藏 API? 内部 API 位于 com.android.internal 包中,该包在真实 Android 设备的 framework.jar 文件中可用,而隐藏 API 位于 android.jar 中具有@hide Javadoc 属性的文件。虽然类和方法是public,但是你不能访问它。您可以从此包中使用漂亮的方法和资源。我将假设这是一个 API,并将其称为隐藏 API。详细了解隐藏 API here。
那么,看看这个@hide 标记:
此类在 API 级别 22 及更高级别上可用。但是,定制的 API 有局限性。 Android Hidden API 不适用于 Lollipop 5.1.1 (API 22) 和 Marshmallow 6.0 (API 23),因为我找不到任何拥有此设备的人。如果你有,请将framework.jar文件从位于/system/framework/framework.jar的物理设备上传到here。我会做一个新的!
另一个限制
我还没有解释隐藏 API 的另一个限制。当您通过此隐藏 API 使用某些功能、方法、资源或类时,这些功能、方法、资源或类仅在特定 API 级别可用,您的应用只能在相应设备的 API 级别内访问它们。例如,您在应用程序中使用android.net.EthernetManager,您必须将目标和编译SDK 设置为android-22(因为该类仅在API 级别22 及更高级别上可用)。在 API 级别 22 或更高级别的设备上运行应用程序后,不会显示任何错误。但是,一旦您在 API 级别 21 或更低级别运行应用程序,就会引发错误,例如 java.lang.NoClassDefFoundError,因为 android.net.EthernetManager 类仅针对 API 22 及更高级别构建。
【讨论】:
getPermissionFlags()之前检查API级别。 Java 反射可以在这样的动态情况下使用。 @IrfanLatif
IIRC 你只能在你的设备被植根的情况下这样做。
这里有一个很好的解释:Ethernet Connectivity through Programatically (Android) (Rooted Device)
【讨论】: