当我被要求对其进行更改以阅读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。如果它有帮助。
答案 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意图的优先权。