NFC和MIME TYPE区分大小写

时间:2014-02-21 15:24:10

标签: android nfc mime-types intentfilter ndef

我正在尝试使用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>

有人知道解决方法吗?

由于

2 个答案:

答案 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>