简体   繁体   English

无法调用NFC onNewIntent()方法

[英]Can't invoke NFC onNewIntent() method

i'm trying to read the ID of Mifare Classic 1k card using foreground dispatch. 我正在尝试使用前台调度读取Mifare Classic 1k卡的ID。 As i can see from my logs, i can enable foreground dispatch, but can not invoke onNewIntent() method. 从日志中可以看到,我可以启用前台分派,但是不能调用onNewIntent()方法。 Any suggestions would be appreciated. 任何建议,将不胜感激。

MainActivity.java 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 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>
....

If you want to be able to detect every MIFARE Classic tag (and not just those that contain a Text record (or a MIME type record with MIME type text/plain), you should adapt your foreground dispatch to detect the specific tag technology rather than a specific NDEF record type: 如果您希望能够检测每个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);
}

If you also want to get the UID of MIFARE Classic tags on devices with Broadcom's NFC chipset (those devices are unable to detect MIFARE Classic as MIFARE Classic due to licensing issues of NXP's proprietary technology), you could instead filter for all NfcA tags (MIFARE Classic will be detected as NfcA on all devices, so you don't need to filter for both NfcA and MifareClassic ): 如果您还想在具有Broadcom NFC芯片组的设备上获取MIFARE Classic标签的UID(由于NXP专有技术的许可问题,这些设备无法将MIFARE Classic识别为MIFARE Classic),则可以过滤所有NfcA标签(MIFARE在所有设备上,Classic都会被检测为NfcA ,因此您无需同时过滤NfcAMifareClassic ):

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

Last, the intent filter in your manifest does not match the intent filter in your code! 最后,清单中的意图过滤器与代码中的意图过滤器不匹配! Your foreground dispatch's equivalent intent filter would be: 您的前台调度的等效意图过滤器为:

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

The manifest equivalent of the foreground dispatch I showed above would be: 我上面显示的与前台调度有关的清单清单是:

<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" />

With nfc_tech_filter.xml containing: 使用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>

Or (in case of matching for NfcA ): 或(如果匹配NfcA ):

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>
</resources>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM