如何模拟应用内开发者工具的 NFC 标签?



我正在尝试使用应用内开发人员模拟工具模拟NFC标签。当前实现使用反射,面向 API 27。使用 AndroidX 迁移到 API 28,找不到方法createMockTag。我注意到它在 Android 代码中public static,但用@Hide注释,这意味着我无法访问它。但是,我已经找到了一种从包裹创建标签的方法,但我还没有找到任何简单的方法来做到这一点。我可以创建自己的 Parcelable 类,但是在构造函数中调用in.readInArray(...)时,它会要求输入我没有的参数。我会附上它看起来像什么,以及我希望它看起来像什么。

这是一个大问题,因为我们需要模拟NFC标签,但似乎没有办法访问该方法。我也尝试将Tag.java类复制到我的项目中,但它无法访问某些看似内部的类,例如INfcTagTagTechnology中的枚举。还有其他人遇到过这个问题,可以帮我吗?谢谢。

// Tag mockTag = Tag.CREATOR.createFromParcel(); // I'd like to create one here
Method createMockTag = Tag.class.getMethod("createMockTag", byte[].class, int[].class, Bundle[].class);     
scanIntent.putExtra(NfcAdapter.EXTRA_TAG, (Tag) createMockTag.invoke(Tag.class, tagId, new int[]{}, new Bundle[]{}));

以下是我看过的链接:

  • https://www.vogella.com/tutorials/AndroidParcelable/article.html
  • https://guides.codepath.com/android/using-parcelable
  • 如何在安卓中创建标签对象?
  • 识别 NFC 标签 ID
  • https://www.google.com/search?client=safari&rls=en&q=android+9+nfc+not+working&ie=UTF-8&oe=UTF-8
  • https://www.google.com/search?client=safari&rls=en&biw=1080&bih=923&ei=68ijXMnoDoHisAXPjLzQCA&q=public+static+Tag+createMockTag%28byte%5B%5D+is%2C+int%5B%5D+techList%2C+Bundle%5B%5D+techList+Extras%29+%7B&oq=public+static+Tag+createMockTag%28byte%5B%5D+is%2C+int%5B%5D+techList%2C+Bundle%5B%5D+techList+Extras%29+%7B&gs_l=psy-ab.3...107084.107084..107212...0.0..0.0.0.......0....1..gws-wiz.rfrM415Sx7o
  • https://developer.android.com/about/versions/pie/android-9.0
  • https://developer.android.com/reference/android/nfc/package-summary.html
  • https://developer.android.com/sdk/api_diff/28/changes.html
  • https://developer.android.com/reference/android/os/Parcelable.Creator
  • 可能还有几个我已关闭或导航离开的选项卡。

你不想从原始代码中复制代码,这不是模拟的工作方式。 如果此特定方法已标记为@Hide则可能意味着它已被弃用。 这可能意味着在 API 28+ 中存在此方法的替代方法。

@Hide可能是因为他们目前还无法完全弃用它,但将来可能会弃用它。 这是当前的参考 - https://developer.android.com/reference/android/nfc/package-summary。

一般来说,假设您使用 Mockito - https://static.javadoc.io/org.mockito/mockito-core/2.25.1/org/mockito/Mockito.html#2 - 只需存根 mock.
对于存根静态方法,看起来有几个线程在那里 - 对于实际的功能请求:https://github.com/mockito/mockito/issues/1013

解决方法:使用 Mockito 模拟静态方法,不确定解决方法的相关性如何(它有点旧)。

最新更新