2017-04-25 160 views
1

我已經從示例中製作了一個應用程序,用於在Android上編寫NFC代碼。我的標籤是恩智浦NTAG216。編寫NFC代碼的Android導致「未知內容」類型

但是我有一個問題:寫我的應用標記後,恩智浦的TagWriter應用顯示的數據爲「未知內容」是這樣的:

然而,當我寫的值作爲「平原文本」採用恩智浦TagWriter,我得到:

這裏是我的onNewIntent代碼:

@Override 
protected void onNewIntent(Intent intent) { 
    // Tag writing mode 
    String zawartosc = "Data from field"; 
    if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { 
     Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8"))); 
     NdefMessage message = new NdefMessage(new NdefRecord[]{record}); 

     if (writeTag(message, detectedTag)) { 
      Toast.makeText(this, "Success", Toast.LENGTH_LONG) 
        .show(); 
     } 
    } 
} 

以及編寫標籤:

public boolean writeTag(NdefMessage message, Tag tag) { 
    int size = message.toByteArray().length; 
    try { 
     Ndef ndef = Ndef.get(tag); 
     if (ndef != null) { 
      ndef.connect(); 
      if (!ndef.isWritable()) { 
       Toast.makeText(getApplicationContext(), 
         "Unwritable", 
         Toast.LENGTH_SHORT).show(); 
       return false; 
      } 
      if (ndef.getMaxSize() < size) { 
       Toast.makeText(getApplicationContext(), 
         "Text is too short", 
         Toast.LENGTH_SHORT).show(); 
       return false; 
      } 
      ndef.writeNdefMessage(message); 
      return true; 
     } else { 
      NdefFormatable format = NdefFormatable.get(tag); 
      if (format != null) { 
       try { 
        format.connect(); 
        format.format(message); 
        return true; 
       } catch (IOException e) { 
        return false; 
       } 
      } else { 
       return false; 
      } 
     } 
    } catch (Exception e) { 
     return false; 
    } 
} 

有沒有辦法以某種方式改變內容類型相同的是NXP TagWriter寫?稍後,如果它是未知類型,則會遇到問題。

回答

2

你得到的正是你寫給標籤的一個MIME類型記錄,其值設置爲UTF-8編碼的字符串「{number_id:」test12「}」和MIME類型設置爲完全相同並且無效!)值。

NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8"))); 

在這裏,同時設置了mimeType論點和論據mimeDatacreateMime()字符串zawartosc:你創作的MIME類型的記錄時這樣做。

你真正想要做的是創建一個純文本記錄。這可以是NFC論壇文本記錄或MIME類型記錄,其MIME類型設置爲「text/plain」。 NFC論壇文本記錄也是恩智浦TagWriter在選擇「純文本」選項時創建的記錄類型。

在Android中,你使用createTextRecord()輔助方法,可以創建一個文本記錄:

NdefRecord record = NdefRecord.createTextRecord("en", zawartosc); 

這適用於API級別21+。請參閱[方法NdefRecord.createTextRecord(「en」,「字符串」)不適用於低於API級別21 (Method NdefRecord.createTextRecord("en" , "string") not working below API level 21)的createTextRecord()的實施方案,適用於最早的Android版本。

如果你喜歡使用MIME類型的記錄,你也可以使用:

NdefRecord record = NdefRecord.createMime("text/plain", zawartosc.getBytes(Charset.forName("US-ASCII"))); 

這將創建一個類型的MIME類型的記錄「text/plain的」包含字符串zawartosc的ASCII編碼值。請注意,text/plain被定義爲包含ASCII編碼的純文本數據。如果你想使用UTF-8編碼,您通常會指定類型名稱的顯式編碼:

NdefRecord record = NdefRecord.createMime("text/plain; encoding=utf-8", zawartosc.getBytes(Charset.forName("UTF-8"))); 

最後,我想知道你是否真的需要運輸的結構化數據(如JSON或類似)文本記錄。文本記錄表示人類可讀的純文本。傳輸特定於應用程序的結構化數據的更好方法是NFC論壇外部類型或自定義MIME類型記錄。

相關問題