对于我正在编写的应用程序,我想知道是否可以从代码创建ACTION_NDEF_DISCOVERED意图。通常,此意图由系统在读取ndef格式化标记时创建。它包含Tag类型的parcableextra。
意图的创建可能很简单,但您是否也可以从代码创建标记,或者我认为该类不支持。
目标是向系统广播带有ndef记录的虚拟标记,然后由可以调用ACTION_NDEF_DISCOVERED意图的应用程序处理。
答案 0 :(得分:1)
您可以使用反射获取模拟标记对象实例。这样的事情应该有效:
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
实例获得)的所有方法都需要使用真实标记进行IO操作或使用NFC服务注册的真实标记失败。具体来说,只有
getCachedNdefMessage()
,getMaxSize()
,getType()
,isWritable()
和getTag()
会奏效。
因此,如果您没有将Tag
对象作为NDEF_DISCOVERED
意图的一部分传递而只是使用EXTRA_NDEF_MESSAGES
意图附加,那么几乎相同的功能可用。