如何从 NFC 标签中获取纯文本?

How to get plain text from NFC Tag?

我已经尝试实现 Google 文档中的代码,但我仍然不清楚。我在这里错过了什么?

这是MainActivity.java中的方法:

    @Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMessages =
                intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i++) {
                messages[i] = (NdefMessage) rawMessages[i];
                Log.i("nfcccc",messages[i].toString());
            }
            // Process the messages array.
            Log.i("from tag: ",messages.toString());
            Toast.makeText(this,messages.toString(),Toast.LENGTH_LONG).show();

        }
    }
}

在 onCreated 方法中我还初始化了 nfcAdapter:

        nfcAdapter = NfcAdapter.getDefaultAdapter(this);

在清单文件中我有这个:

<activity android:name=".MainActivity">

        <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.intent.action.MAIN" />

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



    </activity>

我花了几天时间尝试实现它,但它仍然无法正常工作。 我正在做的是我使用 NFC 工具 android 应用程序来保存纯文本,我想在我自己的应用程序中读取这些数据>

你缺少的是与 Activity 的启动模式的交互,因为 NFC 处理是由另一个系统应用程序完成的,然后与 Google 文档作为如何使用 NFC 的交互,它只是比如您的应用程序正在从另一个应用程序接收数据。

所以onNewIntent

This is called for activities that set launchMode to "singleTop" in their package

https://developer.android.com/reference/android/app/Activity#onNewIntent(android.content.Intent)

您的应用程序默认将启动模式设为 standard,因此永远不会调用 onNewIntent

有 2 个标准部件用于使用带有 Intents 的旧 NFC API

  1. Activity 不是 运行(这通常意味着 App Task 不是 运行),在 Activity 中设置清单过滤器,然后在oncreate 使用 getIntent 然后将 Intent 处理为基于 NFC 的 Intent(按照您在 onNewIntent 上所做的那样)

  2. Activity(和应用程序)是 运行 并且在前台,enableForegroundDispatch https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc#foreground-dispatch 这基本上告诉 NFC 系统应用程序重新启动它Activity 当它是“Top”时 activity 就好像它是“singleTop” Activity,然后 onNewIntent 被传入的 Intent 调用(这有负面影响暂停和恢复 Activity)

请注意,有不同的方法来设置启动模式,Activity 位于堆栈顶部以将 Intent 发送到 onNewIntent,但它们不太常见。
最好在 onCreateenableForegroundDispatch 中处理 NFC 意图,在 onNewIntent

中使用相同的处理

获得更多控制权的更好方法是使用更新更好的 enableReaderMode API https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)

总结 所以只需根据 https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc#foreground-dispatch

添加 foregroundDispatch 的代码