Intent选择器显示NFC TECH_DISCOVERED过滤器和前景调度系统

时间:2016-06-07 15:59:34

标签: android android-intent tags nfc intentfilter

由于我更改了NFC前台调度注册以使用TECH_DISCOVERED意图过滤器,因此我不得不在多个应用程序之间进行选择以处理NFC标记。有没有办法在发现标签时直接在我的应用中接收NFC意图?

public static void setupForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
    IntentFilter[] mFilters = new IntentFilter[] {
            ndef
    };
    final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
    adapter.enableForegroundDispatch(activity, pendingIntent, mFilters, null);
}

public static void stopForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    adapter.disableForegroundDispatch(activity);
}

1 个答案:

答案 0 :(得分:4)

TECH_DISCOVERED意图过滤器需要技术列表。因此,您当前的前台调度注册根本不会监听任何标记技术。

当您通过清单注册该意图过滤器时,您将使用

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

这样做。同样,当您使用enableForegroundDispatch()方法注册前台调度时,需要在enableForegroundDispatch()的最后一个参数中指定tech-list(字符串数组的数组)。例如。要听取所有可能的标签技术(即NFC-A或NFC-B或NFC-F或NFC-V或NFC条形码),您可以使用:

IntentFilter[] filters = new IntentFilter[] {
        new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED),
};
String[][] techList = new String[][] {
        new String[] { NfcA.class.getName() },
        new String[] { NfcB.class.getName() },
        new String[] { NfcF.class.getName() },
        new String[] { NfcV.class.getName() },
        new String[] { NfcBarcode.class.getName() },
};
adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);

请注意,如果您想通过前台调度系统过滤任何标记,您还可以简单地使用catch-all前台调度:

adapter.enableForegroundDispatch(activity, pendingIntent, null, null);

但是,请注意,在这种情况下,TAG_DISCOVERED意图会传递给您的应用。