我当前的手机(Pixel 2 XL)正在运行内部版本PQ1A.181105.017.A1。根据{{3}},这意味着它是从分支android-9.0.0_r16构建的。查看来自该特定分支的源文件,例如source.android.com,有一个名为getWcdmaRscp()的公共方法。但是,似乎此方法是在SDK版本28发布之后添加的,因此,如果我在定位到28时尝试从Android Studio中的应用中调用该方法,则它将无法构建。
我猜我的手机很乐意允许我调用有问题的方法,那么如何设置Android Studio使其能够针对该版本的框架进行构建?
似乎我需要一个新的framework.jar,但是在哪里可以找到呢?请不要告诉我,我需要在本地下载并构建整个AOSP。
答案 0 :(得分:2)
我怀疑它是在API 28发布后添加的。它带有@hide
的注释,这意味着在构建SDK时,它不是内置的。它仍在框架本身中,但是Android Studio不知道。
要解决此问题,您必须使用反射。像这样:
try {
Method getWcdmaRscp = SignalStrength.class.getMethod("getWcdmaRscp");
int rscp = Integer.parseInt(getWcdmaRscp.invoke(signalStrength).toString()); //signalStrength is the instance you have
} catch (Exception ignored) {}
但是,那可能行不通。 Android Pie引入了对访问隐藏方法和类的限制。在奥利奥(Oreo)中,您可以只使用反射。在Pie中,您尝试访问的大多数类都将抛出ClassNotFound
或NoSuchMethodError
异常,因为系统会阻止第三方应用程序访问它们。某些隐藏的API仍可访问,但没有明确的列表。
答案 1 :(得分:1)
您不需要整个框架。
一种方法是按照TheWanderer的建议使用反射,另一种方法是将链接到的源文件SignlaStrength.java添加到项目中。
您只需要确保将其添加到原始包路径/ android / telephony
下即可工作室将使用它进行编译以解析方法签名,但是当在电话上运行时,调用将转到原始框架类。 我没有在文件中看到任何非公共导入,但是如果它不能编译,则可能需要通过删除一些函数内部将其放入存根。