如何从 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
Activity 不是 运行(这通常意味着 App Task 不是 运行),在 Activity 中设置清单过滤器,然后在oncreate
使用 getIntent
然后将 Intent 处理为基于 NFC 的 Intent(按照您在 onNewIntent
上所做的那样)
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
,但它们不太常见。
最好在 onCreate
和 enableForegroundDispatch
中处理 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
的代码
我已经尝试实现 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
Activity 不是 运行(这通常意味着 App Task 不是 运行),在 Activity 中设置清单过滤器,然后在
oncreate
使用getIntent
然后将 Intent 处理为基于 NFC 的 Intent(按照您在onNewIntent
上所做的那样)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
,但它们不太常见。
最好在 onCreate
和 enableForegroundDispatch
中处理 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
的代码