无法调用NFC onNewIntent()方法

时间:2014-06-22 01:27:47

标签: android android-intent nfc intentfilter mifare

我正在尝试使用前台调度读取Mifare Classic 1k卡的ID。正如我从日志中看到的,我可以启用前台调度,但不能调用onNewIntent()方法。任何建议将不胜感激。

MainActivity.java

...
@Override
   protected void onResume() {
      setupForegroundDispatch(this, mAdapter);
      super.onResume();
} 

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);
    System.out.println("Setup FGD.");  // i can see this output.

    final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);

    IntentFilter[] filters = new IntentFilter[1];
    String[][] techList = new String[][]{};

    // Notice that this is the same filter as in our manifest.
    filters[0] = new IntentFilter();
    filters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
    filters[0].addCategory(Intent.CATEGORY_DEFAULT);
    try {
        filters[0].addDataType(MIME_TEXT_PLAIN);
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("Check your mime type.");
    }

    adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
    System.out.println("Enabled FGD.");  // and this one.
}

protected void onNewIntent(Intent intent) { 
    System.out.println("Intent."); but i cannot see this one,
    handleIntent(intent);
}

private void handleIntent(Intent intent) {      
    System.out.println("Handle.");  // and this one.
    String action = intent.getAction();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        System.out.println("NDEF discovered.");
         ....

AndroidManifest

....
 <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <action android:name="android.nfc.action.TAG_DISCOVERED" />
         </intent-filter>

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

1 个答案:

答案 0 :(得分:4)

如果您希望能够检测每个MIFARE Classic标记(而不仅仅是那些包含Text记录(或MIME类型为text / plain的MIME类型记录)的标记,则应调整前台调度以检测特定标记技术而不是特定的NDEF记录类型:

public static void setupForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    final Intent pendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    IntentFilter[] filters = new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED) };
    String[][] techList = new String[][] { new String[] { MifareClassic.class.getName() } };

    adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
}

如果您还希望在具有Broadcom NFC芯片组的设备上获取MIFARE Classic标签的UID(由于恩智浦专有技术的许可问题,这些设备无法将MIFARE Classic检测为MIFARE Classic) ,您可以代替过滤所有NfcA代码(MIFARE Classic将在所有设备上被检测为NfcA,因此您无需对NfcA和{{1}进行过滤}}):

MifareClassic

最后,清单中的intent过滤器与代码中的intent过滤器不匹配!您的前台调度的等效意图过滤器将是:

    String[][] techList = new String[][] { new String[] { NfcA.class.getName() } };

上面显示的前景调度的清单等价物是:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

<intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> 包含:

nfc_tech_filter.xml

或(如果匹配<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.MifareClassic</tech> </tech-list> </resources> ):

NfcA