您可以使用反射获得一个模拟标记对象实例。像这样的东西应该可以工作:
NdefMessage ndefMsg = ...;
Class tagClass = Tag.class;
Method createMockTagMethod = tagClass.getMethod("createMockTag", byte[].class, int[].class, Bundle[].class);
final int TECH_NFC_A = 1;
final int TECH_NDEF = 6;
final String EXTRA_NDEF_MSG = "ndefmsg";
final String EXTRA_NDEF_MAXLENGTH = "ndefmaxlength";
final String EXTRA_NDEF_CARDSTATE = "ndefcardstate";
final String EXTRA_NDEF_TYPE = "ndeftype";
Bundle ndefBundle = new Bundle();
ndefBundle.putInt(EXTRA_NDEF_MSG, 48); // result for getMaxSize()
ndefBundle.putInt(EXTRA_NDEF_CARDSTATE, 1); // 1: read-only, 2: read/write
ndefBundle.putInt(EXTRA_NDEF_TYPE, 2); // 1: T1T, 2: T2T, 3: T3T, 4: T4T, 101: MF Classic, 102: ICODE
ndefBundle.putParcelable(EXTRA_NDEF_MSG, ndefMsg);
Tag mockTag = (Tag)createMockTagMethod.invoke(null,
new byte[] { (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78 },
new int[] { TECH_NFC_A, TECH_NDEF },
new Bundle[] { null, ndefBundle });
这样做的问题是您将无法连接到此标签。因此,Ndef 对象的所有方法(您可以从该模拟 Tag 实例中获取)需要使用真实标签或向 NFC 服务注册的真实标签进行 IO 操作的所有方法都将失败。具体来说,只有
-
getCachedNdefMessage(),
-
getMaxSize(),
-
getType(),
-
isWritable(),和
getTag()
会起作用的。
因此,如果您不将Tag 对象作为NDEF_DISCOVERED 意图的一部分传递,而是仅使用EXTRA_NDEF_MESSAGES 意图额外,那么几乎可以使用相同的功能。