2013-04-11 80 views
1

我正試圖在Ndef標籤上編寫圖像,目前,我可以編寫它,但是當我嘗試使用任何市場應用程序閱讀它時,它們將它視爲文本消息。這裏是我的代碼寫的一塊圖像:使用NdefMessage書寫圖像

 Bitmap mBitmap = Bitmap.createScaledBitmap(mPhoto, 100, 100, true); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     byte[] byteArray = stream.toByteArray(); 
     NdefRecord picRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "image/png".getBytes(), null, byteArray); 
     String informations = "name: "+name + "\ntitle: " + title + "\naddress: "+ address + "\ncity: "+ city + "\nphone: "+ phone + "\nmail: "+mail; 
     NdefRecord textRecord = createTextRecord(informations); 
     NdefMessage message = new NdefMessage(new NdefRecord[]{picRecord, textRecord}); 

我也tryed書面方式的圖像是這樣的:

 NdefMessage msg = new NdefMessage(new NdefRecord[] {createMimeRecord("image/png", byteArray), textRecord}); 

與方法createMimeRecord:

 public NdefRecord createMimeRecord(String mimeType, byte[]payload) { 
     byte[] mimeBytes = mimeType.getBytes(Charset.forName("USASCII")); 
     NdefRecord mimeRecord = new 
     NdefRecord(NdefRecord.TNF_MIME_MEDIA, 
     mimeBytes, new byte[0], payload); 
     return mimeRecord; 
     } 

下面是結果我在嘗試使用「TagInfo」應用程序閱讀我的圖像時獲得:enter image description here

文本消息寫得很好,可以正常讀取。我嘗試過使用「createMime(String mime type,byte [] data),但這種方法似乎」未定義「。我嘗試以Jpeg格式壓縮位圖圖像,結果相同。找到通過NdefMessages發送圖像的例子,但沒有找到任何建議?

+0

就我所知,使用NFC傳輸圖像並不常見。它具有較慢的傳輸速度和很低的範圍。而分辨率更高的圖像相當大。如果你想顯示圖像,創建一個能夠顯示通過nfc接收的圖像的應用程序? – damian 2013-04-11 09:47:26

+0

我想要做的是通過NFC標籤存儲和讀取名片的應用程序。我不想用另一個應用程序來顯示它,實際上我希望任何閱讀NdefMessaged的Nfc應用程序都能夠顯示我的圖像。 – Jinbonka 2013-04-11 09:49:49

回答

1

最後搜索應用程序書面方式和NFC標籤讀取名片後一無所獲。我決定創建自己的名片並自己閱讀。這裏是我用用NDEF消息寫卡代碼:

 Bitmap mBitmap = mPhoto; 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream); 
     byte[] byteArray = stream.toByteArray(); 
     NdefRecord picRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "image/jpeg".getBytes(), null, byteArray); 
     String informations = "name: "+name + "\ntitle: " + title + "\naddress: "+ address + "\ncity: "+ city + "\nphone: "+ phone + "\nmail: "+mail + "\n"; 
     NdefRecord textRecord = createTextRecord(informations); 
     NdefMessage message = new NdefMessage(new NdefRecord[]{picRecord, textRecord}); 

這裏是爲閱讀部分的代碼:

 NdefRecord picRecord = records[0]; 
     NdefRecord infoRecord = records[1]; 
     byte[] picload = picRecord.getPayload(); 
     byte[] infoload = infoRecord.getPayload(); 
     Bitmap photo = BitmapFactory.decodeByteArray(picload, 0, picload.length); 
     String textEncoding = ((infoload[0] & 0200) == 0) ? "UTF-8" : "UTF-16"; 
     int languageCodeLength = infoload[0] & 0077; 
     String text = null; 
     try{ 
      String languageCode = new String(infoload, 1, languageCodeLength, "US-ASCII"); 
      text = new String(infoload, languageCodeLength + 1,infoload.length - languageCodeLength - 1, textEncoding); 
     }catch(Exception e){ 
      Alert("String decoding", e.toString()); 
      return; 
     } 

將JPEG加密有很大幫助,而不失去對圖像進行壓縮質量太高。標籤上的傳輸需要2-3秒,但解決方案運行良好。

0

如果你的用例是在NFC標籤上存儲名片,我建議你不要存儲圖像數據,而是一個鏈接否則您將很難將名片存儲在普通標籤上(通常標籤大小爲1K或4K),傳輸數據的時間也會過長。根據vCard規範,您可以同時執行以下操作:以base64格式存儲二進制圖像數據,也存儲url鏈接(我強烈推薦)

欲瞭解更多信息關於被電子名片樣子的格式在這裏:

http://en.wikipedia.org/wiki/VCard

或在這裏更多的細節:

http://tools.ietf.org/html/rfc2426#section-3.1.4

+0

好吧,我的標籤上有64k的存儲空間,所以它不是一個真正的問題。我一直在試圖創建一個名片NdefMessage,但失敗了,你有一些關於如何寫和讀vCard的示例代碼?你使用ndef-tools庫嗎? – Jinbonka 2013-04-12 06:47:40

+0

根據卡的類型,NDEFMessage的寫入方式不同。你使用什麼類型的卡?我懷疑你可以使用卡上的所有64K作爲NDEF。我沒有使用ndef-tools庫。 – 2013-04-15 13:49:35