2014-02-21 42 views
4

我在嘗試NFC的基本版本,但後來我發現MIME TYPE區分大小寫。我的應用的軟件包名稱有一個大寫字母。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

根據RFC,MIME類型不區分大小寫。但是,Android的意圖過濾器matiching區分大小寫。爲了克服這個問題,您應該只使用小寫MIME類型總是

具體來說,使用Android NFC API的MIME類型記錄幫助程序方法,MIME類型將自動轉換爲小寫字母。因此,使用混合大小寫的類型名稱調用方法NdefRecord.createMime()將始終導致只創建一個小寫的MIME類型名稱。例如。

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> 
0

它讓我瘋狂了一個星期。我終於明白了。 即使我的包名稱中有大寫字母。您必須在代碼和意圖過濾器中用小寫字母書寫MIME類型。我真的知道他們不是同一個包,但是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>