我正在尝试使用NFC的基本版本,但之后我发现MIME TYPE区分大小写。我的应用程序的程序包名称有一个大写字母。
包名:com.example.Main_Activity
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/com.example.Main_Activity"/>
</intent-filter>
有人知道解决方法吗?
由于
答案 0 :(得分:2)
根据RFC,MIME类型不区分大小写。但是,Android的意图过滤器matiching区分大小写。为了解决这个问题,您应该始终仅使用小写MIME类型。
特别是使用Android NFC API的MIME类型记录帮助程序方法,MIME类型将自动仅转换为小写字母。因此,使用混合大小写类型名称调用方法NdefRecord.createMime()
将始终导致创建仅小写的MIME类型名称。 E.g。
NdefRecord r1 = NdefRecord.createMime("text/ThisIsMyMIMEType", ...);
NdefRecord r2 = NdefRecord.createMime("text/tHISiSmYmimetYPE", ...);
NdefRecord r3 = NdefRecord.createMime("text/THISISMYMIMETYPE", ...);
NdefRecord r4 = NdefRecord.createMime("text/thisismymimetype", ...);
将导致创建相同的MIME类型记录类型:
+----------------------------------------------------------+
| MIME:text/thisismymimetype | ... |
+----------------------------------------------------------+
所以你的意图过滤器也需要是全小写的字母:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/thisismymimetype" />
</intent-filter>
答案 1 :(得分:1)
这让我疯了一个星期。我终于明白了。 即使我的包名称中包含大写字母。您必须在代码和意图过滤器中以小写字母编写MIME TYPE。我知道他们不是同一个包,但NFC中的MIME TYPE仍会识别你的应用程序。只需确保在创建应用程序记录时编写正确的包。如果您发现我必须使用包含CAPS的正确包名。否则您的申请将无法找到。
希望这有助于他人。
public NdefMessage createNdefMessage(NfcEvent event) {
String text = ("Beam me up, Android!\n\n" +
"Beam Time: " + System.currentTimeMillis());
NdefMessage msg = new NdefMessage(
new NdefRecord[] { NdefRecord.createMime(
"application/com.example.main_activity", text.getBytes())
/**
* The Android Application Record (AAR) is commented out. When a device
* receives a push with an AAR in it, the application specified in the AAR
* is guaranteed to run. The AAR overrides the tag dispatch system.
* You can add it back in to guarantee that this
* activity starts when receiving a beamed message. For now, this code
* uses the tag dispatch system.
*/
,NdefRecord.createApplicationRecord("com.example.Main_Activity")
});
return msg;
}
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/com.example.main_activity"/>
</intent-filter>