我正在开发一款使用NFC标签进行识别的应用。然而,我发现的所有示例都是关于在读取某张卡时启动应用程序。我试着寻找一个关于如何以不同方式做到这一点的示例或文档,但无济于事。
我想要的是:
我现在有一些代码正在运行,我只是没有获得标签数据:
在onCreate
:
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
tech = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
try {
tech.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] { tech };
在onResume
:
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);
当应用处于有效状态时,意图才会到达,但我收到的Intent
是我自己定义的PendingIntent
,而不是我想要的ACTION_TECH_DISCOVERED
意图。
答案 0 :(得分:6)
我在这里找到了部分答案:NFC broadcastreceiver problem
该解决方案没有提供完整的工作示例,所以我尝试了一点额外的。为了帮助未来的访问者,我将发布我的解决方案。它是NfcActivity
的子类Activity
,如果你继承这个NfcActivity
,你所要做的就是实现它的NfcRead
方法,你很高兴:< / p>
public abstract class NfcActivity extends Activity {
// NFC handling stuff
PendingIntent pendingIntent;
NfcAdapter nfcAdapter;
@Override
public void onResume() {
super.onResume();
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}
@Override
protected void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this);
}
// does nothing, has to be overridden in child classes
public abstract void NfcRead(Intent intent);
@Override
public void onNewIntent(Intent intent) {
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
NfcRead(intent);
}
}
}
答案 1 :(得分:2)
如果您希望用户首先启动您的应用并且只扫描NFC卡,我建议您使用NFC foreground dispatch。这样,您的Activity不需要在清单中有任何意图过滤器(因此当用户扫描另一张NFC卡时,不会被意外调用)。 启用前台调度后,您的活动可以直接接收所有NFC意图(没有任何应用选择器弹出窗口)并决定如何处理它(例如将其传递给另一个活动)。