如果SDK中缺少导入的类,Android项目如何编译?

wor*_*cle 10 android android-build android-sdk-tools android-studio android-studio-import

好吧,也许这很简单,但我现在无法理解.

我在Android Studio 1.5.1中导入了google示例项目读卡器,它在compileSdkVerison 23上编译,它可以在我的手机上运行.

然后我走过SDK来源代码android.nfc.tech.BasicTagTechnology,我发现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
Run Code Online (Sandbox Code Playgroud)

然后我做了一些随机的事情,在我同步项目后,清理并重建,无效缓存/重启,仍然无法解决TransceiveResult方式,我想知道因为符号已经丢失在SDK中,如何编译项目顺利?

编辑我终于啊哈

我们调用android.nfc.tech.BasicTagTechnology#transceive代码而不是TransceiveResult在编译时我们不需要解决TransceiveResult,我们只需要解析android.nfc.tech.BasicTagTechnology#transceive代码中引用的代码,那时我就迷失了.

djo*_*djo 7

@hide意味着它不包含在这里描述的文档中,它也会从你编译的android.jar中的类中删除.但是这些在运行时可用.

更新: 要在深入了解SDK类时在IDE中进行说明,您可能会看到对无法解析的隐藏成员的引用.这没关系,只要那些不在你的代码中的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});
Run Code Online (Sandbox Code Playgroud)

这是一个更好的选择,因为它更灵活,您可以检查类/方法是否存在以初始化/调用它们,捕获异常等.