有没有办法从代码创建ACTION_NDEF_DISCOVERED意图

时间:2014-11-03 11:06:06

标签: android android-intent tags nfc ndef

对于我正在编写的应用程序,我想知道是否可以从代码创建ACTION_NDEF_DISCOVERED意图。通常,此意图由系统在读取ndef格式化标记时创建。它包含Tag类型的parcableextra。

意图的创建可能很简单,但您是否也可以从代码创建标记,或者我认为该类不支持。

目标是向系统广播带有ndef记录的虚拟标记,然后由可以调用ACTION_NDEF_DISCOVERED意图的应用程序处理。

1 个答案:

答案 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意图附加,那么几乎相同的功能可用。