只需阅读NFC标签即可

时间:2013-05-06 13:19:49

标签: android nfc

我正在开发一款使用NFC标签进行识别的应用。然而,我发现的所有示例都是关于在读取某张卡时启动应用程序。我试着寻找一个关于如何以不同方式做到这一点的示例或文档,但无济于事。

我想要的是:

  1. 用户启动我的应用
  2. 用户扫描NFC卡
  3. app决定下一步
  4. 我现在有一些代码正在运行,我只是没有获得标签数据:

    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意图。

2 个答案:

答案 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意图(没有任何应用选择器弹出窗口)并决定如何处理它(例如将其传递给另一个活动)。