[英]Nfc and Intent-filter
我寫了這樣的NFC文本標簽
myscheme://company?page=2&poiId=140
然后,我在清單文件中創建了一個這樣的Intent過濾器,以打開我的應用程序(然后使用標記信息來調用WS)
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" android:scheme="myscheme" android:host="company"/>
</intent-filter>
如果我從數據標簽中刪除scheme
和host
參數,那么一切正常,但是通過添加過濾,它不再起作用。
為什么呢
有解決方案嗎?
正如corvairjo正確地寫道,“ 您正在將記錄類型MIME類型(此處為文本/純文本)與記錄類型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>
由於數據有效載荷是人類可讀的文本,因此意圖過濾器無法對文本的任何特定部分進行過濾(Android上的意圖過濾器只能匹配類型信息和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>
您正在將記錄類型MIME類型(此處為文本/純文本)與記錄類型URI混合到一個意圖過濾器中。 您只能使用一個。
您可以刪除MIME類型定義,而只需使用URI定義即可:
<data android:scheme="myscheme" android:host="company"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.