NFC广播接收器问题

时间:2011-04-16 10:39:20

标签: android broadcastreceiver nfc

我希望我的应用只在激活后才能收听nfc标签。为此我尝试注册一个nfc监听器如下,没有任何成功。

IntentFilter filter = new IntentFilter("android.nfc.action.TECH_DISCOVERED"); 
registerReceiver(nfcTagListener, filter); 

BroadcastReceiver nfcTagListener = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) { 
            String action = intent.getAction(); 

            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
                Log.d("nfc", "" + tag.getId());     
            }
        }
    };

我也尝试在apidemos之后声明我的清单中的意图并且完美地工作,它启动我的活动并获得nfc标记id。但这不是我想要的,我只想在我进入该活动时检测标签ID。我认为它可能与api演示中包含的以下行有关。但我不知道如何以编程方式做到这一点

      <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/filter_nfc"> 

任何提示?

谢谢!

2 个答案:

答案 0 :(得分:6)

尝试使用Foreground Dispatch System。

要启用它,在活动的onCreate方法上,你应该准备一些东西:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

之后,创建IntentFilters(在我的示例中,所有操作都使用Intent Filters处理):

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }

    IntentFilter tech = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
    try {
        tech.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }

    IntentFilter[] intentFiltersArray = new IntentFilter[] { tag, ndef, tech };

之后,您需要一个String数组来包含支持的技术:

    String[][] techList = new String[][] { new String[] { NfcA.class.getName(),
            NfcB.class.getName(), NfcF.class.getName(),
            NfcV.class.getName(), IsoDep.class.getName(),
            MifareClassic.class.getName(),
            MifareUltralight.class.getName(), Ndef.class.getName() } };
在onResume方法中,您应该启用前台调度方法:

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);

并在onPause中禁用:

@Override
protected void onPause() {
    super.onPause();
    nfcAdapter.disableForegroundDispatch(this);
}

通过这种方式,您已成功初始化所需的机制。要处理收到的Intent,您应该覆盖onNewIntent(Intent intent)方法。

@Override
public void onNewIntent(Intent intent) {
    String action = intent.getAction();

    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
        // reag TagTechnology object...
    } else if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        // read NDEF message...
    } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {

    }
}

注意:如果您只想通过前台调度来处理意图,请不要在清单文件中启用Intent Dispatch System,只需在那里为您的应用程序提供正确的权限。

我希望有所帮助。

答案 1 :(得分:0)

如果您不想使用前台模式,您始终可以programmatically启用或禁用意图过滤器。

NDEF Tools for Android项目使用前台模式运行样本,也检测

  1. NFC设备支持
  2. 在活动启动时启用/禁用NFC,或稍后更改
  3. 在活动启动时启用/禁用NFC推送,或稍后更改