NFC标签具有UID /序列号,但getByteArrayExtra返回null

时间:2015-06-18 11:57:00

标签: android android-intent tags nfc ndef

当我被要求对其进行更改以阅读NFC标签的唯一序列号时,我正在开发一个处于最后阶段的应用程序。没有大问题,但是在某些标签的情况下,序列号将返回为null。

使用NFC工具应用程序检查标记时,序列号存在但#include <iostream> #include <boost/msm/back/state_machine.hpp> #include <boost/msm/front/state_machine_def.hpp> #include <boost/msm/front/functor_row.hpp> namespace { using namespace boost::msm; using namespace boost::msm::front; namespace mpl = boost::mpl; struct EvGotoSub1 {}; struct EvGotoSub2 {}; struct MainSM_; using Main = back::state_machine<MainSM_>; struct Sub1SM_; using Sub1 = back::state_machine<Sub1SM_>; struct Sub2SM_; using Sub2 = back::state_machine<Sub2SM_>; struct Sub1SM_ : state_machine_def<Sub1SM_> { struct Started : state<> { }; using initial_state = mpl::vector<Started>; struct transition_table:mpl::vector< Row<Started, EvGotoSub2, Sub2, none, none> > {}; }; struct Sub2SM_ : state_machine_def<Sub2SM_> { struct Started : state<> { }; using initial_state = mpl::vector<Started>; struct transition_table:mpl::vector< // Uncomment line below to break things //Row<Started, EvGotoSub1, Sub1, none, none> > {}; }; struct MainSM_ : state_machine_def<MainSM_> { struct Started : state<> { }; using initial_state = mpl::vector<Started>; struct transition_table:mpl::vector< Row<Started, EvGotoSub1, Sub1, none, none>, Row<Started, EvGotoSub2, Sub2, none, none> > {}; }; } int main() { Main main; main.start(); main.process_event(EvGotoSub1()); main.process_event(EvGotoSub2()); main.process_event(EvGotoSub1()); } 方法调用intent.getByteArrayExtra(),因为参数在这些标记的情况下返回NfcAdapter.EXTRA_ID

下面你有我的Android清单和我用来获取UID的代码,如果有帮助的话。

null

Android Manifest

@Override
protected String doInBackground(Tag... params) {
    Tag tag = params[0];

    // New code to deal with multiple tag versions (supports NfcA, NDEF, MifareUltralight)

    // parse tech list
    byte[] uid = getIntent().getByteArrayExtra(NfcAdapter.EXTRA_ID);

    String serialNumber = uidByteToHexString(uid);

    if (serialNumber != null && !serialNumber.isEmpty()) {
        return serialNumber;
    }

我的另一个问题是:在阅读标签时,某些标签会触发选择器对话框,让我选择要用于处理标签的应用程序。是否有可能消除这种情况并让我的应用程序处理活动时的NFC事件?

我使用的标签是NfcA,MifareUltralight和Ndef。如果它有帮助。

1 个答案:

答案 0 :(得分:0)

getIntent().getByteArrayExtra(NfcAdapter.EXTRA_ID)返回null时,这意味着getIntent()不是NFC意图。鉴于您发布的清单(并假设上述代码在MyActivityNameHere中使用),这意味着getIntent()为您提供启动器意图(具有类别LAUNCHER的操作MAIN)或显式意图)。

通常,这可能有两个原因:

  • 您的活动是通过点击其启动器图标(或其他活动/组件)启动的。您之后扫描了NFC标记,该事件是通过onNewIntent()方法提供的(例如,因为您注册了前台调度系统),但您没有使用setIntent()更新活动的意图字段。在这种情况下,getIntent()仍将返回最初启动活动的意图,而不是您稍后收到的NFC意图。

  • NFC标签包含Android应用程序记录(AAR),但其第一条记录不是文本/普通记录。由于您的NDEF_DISCOVERED意图过滤器需要将text / plain NDEF记录作为第一条记录,因此Android不知道您的活动支持该类型的标记,因此使用MAIN + LAUNCHER意图而非NFC意图启动您的应用。因此,此意图既不包含标记ID也不包含标记的句柄。

您可以使用intent.getAction()检查意图的类型。对于NFC意图,这将返回

之一
  • android.nfc.action.NDEF_DISCOVERED
  • android.nfc.action.TECH_DISCOVERED
  • android.nfc.action.TAG_DISCOVERED

关于意图选择器对话框,我建议您通读How NFC Tags are Dispatched to Applications。本文档深入解释了应用程序如何获得NFC意图的优先权。