好吧,也许这很简单,但我现在无法理解。
我在Android Studio 1.5.1中导入了Google示例项目Card Reader,它在compileSdkVerison 23上编译,它可以在我的手机上运行。
然后,当我找到android.nfc.tech.BasicTagTechnology
的源代码时,我走过SDK,发现TransceiveResult
内的android.nfc.tech.BasicTagTechnology#transceive
无法解析,然后我找到了班级TransceiveResult
在我的D:\Android\sdk\platforms\android-23\android.jar
中缺少,但在此处显示Android源代码D:\Android\sdk\sources\android-23\android\nfc\TransceiveResult.java
然后我意识到它可以隐藏在公共区域,而不是导出,实际上它是
/**
* Class used to pipe transceive result from the NFC service.
*
* @hide
*/
public final class TransceiveResult implements Parcelable
然后我做了一些随机的事情,在我同步项目,清理和重建,使缓存无效/重新启动后,仍然无法解决TransceiveResult
顺便说一句,我想知道因为符号已经丢失在SDK中,项目如何顺利编译?
编辑我终于啊哈
我们在代码而不是android.nfc.tech.BasicTagTechnology#transceive
中调用TransceiveResult
,在编译时我们无需解析TransceiveResult
,我们只需要解析引用的android.nfc.tech.BasicTagTechnology#transceive
在我们的代码中,我当时迷失了。
答案 0 :(得分:7)
@hide意味着它不包含在描述here的文档中,并且它也会从你编译的android.jar中的类中删除。 但是这些在运行时可用。
<强>更新强> 要深入了解您的IDE,当您深入了解SDK类时,您可能会看到无法解析的隐藏成员的引用。这没关系,只要它们在SDK类中而不在您的代码中,它仍然可以编译。
如果您想使用这些隐藏的类/方法/字段,您有两个主要选项:
1)获取完整版的android-framework.jar并能够编译。然而,这有一个缺点,即编译后的代码可能无法在其他Android版本中运行,因为Class或方法可能不存在。 例如,BasicTagTechnology实际上是私有包,因此无论如何都无法访问它
2)使用反射:
Class tr = Class.forName("android.nfc.TransceiveResult");
Constructor constructor =
tr.getConstructor(new Class[]{int.class, byte[].class});
Object trObj = constructor.newInstance(1, new byte[]{1,2});
这是一个更好的选择,因为它更灵活,您可以检查类/方法是否存在以初始化/调用它们,捕获异常等。