2

我正在尝试在 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 type, byte[] data) 但此方法似乎“未定义”。我尝试以相同的结果压缩 Jpeg 格式的位图图像。我也尝试过找到通过 NdefMessages 发送图像的示例,但没有找到。有什么建议吗?

4

2 回答 2

1

最后在搜索应用程序在 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 秒,但解决方案效果很好。

于 2013-04-15T07:38:25.310 回答
0

如果您的用例是将名片存储在 NFC 标签上,我建议您不要存储图像数据,而是存储图像的链接。否则,您将很难将名片存储在普通标签上(标签的通常大小为 1K 或 4K),并且传输数据的时间也会太长。根据 vCard 规范,您可以同时执行以下操作:以 base64 格式存储二进制图像数据以及 url 链接(我强烈推荐)。

有关 vCard 格式的更多信息,请参见此处:

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

或在此处更详细地说明:

https://www.rfc-editor.org/rfc/rfc2426#section-3.1.4

于 2013-04-11T13:45:26.520 回答