Запись изображения с помощью NdefMessage

Я пытаюсь записать изображение в тег Ndef, в настоящее время я могу его записать, но когда я пытаюсь прочитать его с помощью любого приложения на рынке, они обрабатывают его как текстовое сообщение. вот мой кусок кода, записывающий изображение:

        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»: введите описание изображения здесь

Текст сообщения хорошо написан и может быть прочитан нормально. Я пытался использовать «createMime (тип String mime, данные byte []), но этот метод кажется «неопределенным». Я пытался сжать растровое изображение в формате Jpeg с тем же результатом. Также я пытался найти примеры отправки изображений через NdefMessages, но не нашел ни одного предложения?


person Jinbonka    schedule 11.04.2013    source источник
comment
насколько я знаю, передача изображений с помощью NFC встречается редко. он имеет медленную скорость передачи и очень низкий диапазон. а изображения с более высоким разрешением довольно большие. если вы хотите отображать свое изображение, создайте приложение, способное отображать изображения, полученные через nfc?   -  person damian    schedule 11.04.2013
comment
То, что я пытаюсь сделать, - это приложение, которое хранит и читает визитную карточку по тегу NFC. Я не хочу использовать другое приложение для его отображения, на самом деле я хотел бы, чтобы любое приложение Nfc, читающее NdefMessaged, могло отображать мое изображение.   -  person Jinbonka    schedule 11.04.2013


Ответы (2)


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

        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 секунды, но решение работает хорошо.

person Jinbonka    schedule 15.04.2013

Если ваш вариант использования заключается в хранении визитной карточки на метке NFC, я бы посоветовал вам хранить не данные изображения, а ссылку на изображение. В противном случае вам будет сложно хранить визитку на обычных метках (обычный размер меток 1К или 4К), а также время на передачу данных будет слишком большим. В соответствии со спецификацией vCard вы можете делать как: хранить двоичные данные изображения в формате base64, так и URL-ссылку (что я настоятельно рекомендую).

Подробнее о формате vCard смотрите здесь:

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

или подробнее здесь:

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

person Kamen Goranchev    schedule 11.04.2013
comment
Ну, у меня 64 КБ памяти на моем теге, так что это не проблема. Я пытался создать vCard NdefMessage, но потерпел неудачу. У вас есть пример кода, как писать и читать vCard? Используете ли вы библиотеку ndef-tools? - person Jinbonka; 12.04.2013
comment
В зависимости от типа карты NDEFMessage записывается по-разному. Какой тип карты вы используете? Я сомневаюсь, что вы сможете использовать все 64 КБ на вашей карте для NDEF. Я не использовал библиотеку ndef-tools. - person Kamen Goranchev; 15.04.2013