【问题标题】:Writing an image using NdefMessage使用 NdefMessage 编写图像
【发布时间】:2013-04-11 09:43:17
【问题描述】:

我正在尝试在 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 发送图像的示例,但没有找到。有什么建议吗?

【问题讨论】:

  • 据我所知,使用 NFC 传输图像并不常见。它的传输速度很慢,范围很小。分辨率更高的图像很大。如果要显示图像,请创建一个能够显示通过 nfc 接收的图像的应用程序?
  • 我正在尝试做的是一个通过 NFC 标签存储和读取名片的应用程序。我不希望使用其他应用程序来显示它,实际上我希望任何读取 NdefMessaged 的​​ Nfc 应用程序都能够显示我的图像。

标签: android tags nfc ndef


【解决方案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 秒,但解决方案效果很好。

【讨论】:

    【解决方案2】:

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

    有关 vCard 格式的更多信息,请查看此处:

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

    或在此处了解更多详情:

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

    【讨论】:

    • 我的标签上有 64k 的存储空间,所以这不是问题。我一直在尝试创建一个 vCard NdefMessage,但失败了,你有一些关于如何编写和读取 vCard 的示例代码吗?你使用 ndef-tools 库吗?
    • 根据卡的类型,NDEFMessage 的写入方式不同。您使用的卡类型是什么?我怀疑您是否可以将卡上的所有 64K 用于 NDEF。我没有使用 ndef-tools 库。
    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 2011-04-14
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多