正如corvairjo 正确写的那样,“您将记录类型 MIME 类型(此处为 text/plain)与记录类型 URI 混合到一个意图过滤器中。您应该只使用一个。”
重点是 NDEF 记录由类型信息和数据负载组成(实际上不止这两个字段,但这两个应该足以理解其背后的概念):
+------+---------+
| TYPE | PAYLOAD |
+------+---------+
如果你创建一个包含你的 URI 的文本记录,你会得到这样的东西:
+------------+-------------------------------------+
| text/plain | myscheme://company?page=2&poiId=140 |
+------------+-------------------------------------+
接收设备将根据其类型字段解释记录。因此,它会将有效负载 ("myscheme://company?page=2&poiId=140") 视为一段人类可读的文本 - 而不视为 URI!
在 Android 上,这意味着记录被检测为一条 MIME 媒体类型为“text/plain”的人类可读信息。因此,您只能使用这样的意图过滤器来捕获它:
<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 过滤器无法过滤该文本的任何特定部分(Android 上的 Intent 过滤器只能匹配类型信息和 URI)。
因此,如果您希望有一个与 URI 匹配的意图过滤器,则必须将 URI 包装到一个记录类型中,该记录类型专门将数据负载标识为 URI。这通常使用 NFC 论坛 URI 记录类型来完成:
+---------------+-------------------------------------+
| urn:nfc:wkt:U | myscheme://company?page=2&poiId=140 |
+---------------+-------------------------------------+
标签编写器应用程序通常提供将 URI/URL 写入标签的选项。 Android NFC API 提供了NdefRecord.createUri() 方法来创建URI 记录。
然后您可以使用这样的意图过滤器来触发包含记录的标签:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myscheme" android:host="company" />
</intent-filter>