2013-04-11 3 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}); 

я также судимое сочинительство изображения таким образом:

 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), но этот метод кажется« undefined ». Я попытался сжать изображение растрового изображения в формате Jpeg с тем же результатом. Также я попытался найти примеры отправки изображений через NdefMessages, но не нашел. Любое предложение?

+0

Насколько я знаю, передача изображений с помощью NFC необычна. он имеет медленную скорость передачи и очень низкий диапазон. и изображения с более высоким разрешением довольно велики. если вы хотите отобразить свое изображение, создайте приложение, которое сможет отображать изображения, полученные через nfc? – damian

+0

Что я пытаюсь сделать, это приложение, которое хранит и читает визитную карточку над тегом NFC. Я не хочу использовать другое приложение, чтобы показать его, на самом деле я хотел бы, чтобы любое приложение Nfc, считывающее NdefMessaged, могло отображать мое изображение. – Jinbonka

ответ

1

Наконец, после поиска для написания приложений и чтения Визитная карточка на NFC тег и ничего не обнаружил. Я решил создать свою визитную карточку и прочитать ее сам. Вот код, я использовал для записи карты с помощью сообщений ЦНК:

 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 памяти на моем теге, поэтому это не проблема. Я пытался создать vCard NdefMessage, но не удалось, у вас есть пример кода о том, как писать и читать vCard? Вы используете библиотеку ndef-tools? – Jinbonka

+0

В зависимости от типа карты NDEFMessage записывается по-разному. Какой тип карты вы используете? Я сомневаюсь, что вы можете использовать все 64K на своей карте для NDEF. Я не использовал библиотеку ndef-tools. –