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
代码中引用的代码,那时我就迷失了.
@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)
这是一个更好的选择,因为它更灵活,您可以检查类/方法是否存在以初始化/调用它们,捕获异常等.
归档时间: |
|
查看次数: |
972 次 |
最近记录: |