You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android使用Agora SDK实现点对点聊天发图片及getThumbnail异常求助

点对点聊天发送图片问题排查

问题描述

需要实现点对点聊天发送图片功能,现有实现代码如下:

RtmRequestId requestId = new RtmRequestId();
mRtmClient.createImageMessageByUploading(fileName, requestId, new ResultCallback() {
    @Override
    public void onSuccess(RtmImageMessage rtmImageMessage) {

    }
    @Override
    public void onFailure(ErrorInfo errorInfo) {

    }
});

private void isNetworkAvailableUploadGallImage(String profileImageString , byte[] bitmap) {
    Log.d("ImageUpload", profileImageString);
    if (!connD.isConnectingToInternet()) {
        Toast.makeText(this, getResources().getString(R.string.internetUnAvailable), Toast.LENGTH_SHORT).show();
    } else {
        RtmRequestId requestId = new RtmRequestId();
        mRtmClient.createImageMessageByUploading(profileImageString, requestId, new ResultCallback<RtmImageMessage>() {
            @Override
            public void onSuccess(RtmImageMessage rtmImageMessage) {
                media_id = rtmImageMessage.getMediaId();
                Log.d("byte array",""+bitmap);
                rtmImageMessage.setThumbnail(bitmap);
                mRtmClient.sendMessageToPeer(toProfID, rtmImageMessage, new SendMessageOptions(), new ResultCallback<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        runOnUiThread(() -> {
                            byte[] imageBytes = rtmImageMessage.getThumbnail();
                            Toast.makeText(getApplicationContext(), "sendMessageToPeer", Toast.LENGTH_SHORT).show();
                            Log.d("image send ", "" + imageBytes);
                            String str=new String(imageBytes);
                            massageList.add(new ChatItem(ChatItem.LayoutThree,"",str , dateTime, true));
                            chatAdapter.notifyDataSetChanged();
                        });
                    }
                    @Override
                    public void onFailure(ErrorInfo errorInfo) {
                        Log.d("image send fail", errorInfo.toString()+errorInfo.getErrorDescription());
                    }
                });
            }
            @Override
            public void onFailure(ErrorInfo errorInfo) {
                Log.d("OnFalu", errorInfo.getErrorCode() + errorInfo.toString());
                runOnUiThread(() -> {
                    Toast.makeText(getApplicationContext(), "" + errorInfo.toString(), Toast.LENGTH_SHORT).show();
                });
            }
        });
    }
}

遇到的问题:调用rtmImageMessage.getThumbnail()获取缩略图字节数组时,打印输出为类似byte array: [B@419089a的格式,无法得到预期的正常字节数组内容。


问题原因

  1. 你看到的[B@xxxx格式不是返回值有问题,是Java中直接打印字节数组对象的默认toString()输出规则:[B代表字节数组类型,后面的十六进制字符串是对象的内存地址,不是数组实际内容。
  2. 代码中存在额外错误:直接将图片二进制字节数组转为普通String存储的逻辑是错误的,二进制图片数据无法用普通字符串编码,会直接导致数据损坏,后续无法正常渲染为图片。

修复方案

1. 正确校验字节数组有效性

如果要确认字节数组返回正常,打印数组长度即可,长度符合预期就代表数据正常:

// 导入java.util.Arrays可打印数组具体内容
Log.d("image send ", "缩略图字节长度:" + imageBytes.length);
Log.d("image send ", "缩略图内容:" + Arrays.toString(imageBytes));

2. 修正聊天数据存储逻辑

不要把图片字节转成String存储,直接存原始字节数组,Adapter渲染时直接转为Bitmap即可:

// 存储时直接传字节数组
massageList.add(new ChatItem(ChatItem.LayoutThree,"", imageBytes, dateTime, true));

// Adapter渲染时转换逻辑
Bitmap thumbnail = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
yourImageView.setImageBitmap(thumbnail);

3. 修复后核心代码参考

private void isNetworkAvailableUploadGallImage(String profileImageString , byte[] thumbnailBytes) {
    Log.d("ImageUpload", profileImageString);
    if (!connD.isConnectingToInternet()) {
        Toast.makeText(this, getResources().getString(R.string.internetUnAvailable), Toast.LENGTH_SHORT).show();
        return;
    }
    RtmRequestId requestId = new RtmRequestId();
    mRtmClient.createImageMessageByUploading(profileImageString, requestId, new ResultCallback<RtmImageMessage>() {
        @Override
        public void onSuccess(RtmImageMessage rtmImageMessage) {
            media_id = rtmImageMessage.getMediaId();
            rtmImageMessage.setThumbnail(thumbnailBytes);
            mRtmClient.sendMessageToPeer(toProfID, rtmImageMessage, new SendMessageOptions(), new ResultCallback<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    runOnUiThread(() -> {
                        byte[] imageBytes = rtmImageMessage.getThumbnail();
                        Toast.makeText(getApplicationContext(), "图片发送成功", Toast.LENGTH_SHORT).show();
                        // 直接存原始字节数组
                        massageList.add(new ChatItem(ChatItem.LayoutThree,"", imageBytes, dateTime, true));
                        chatAdapter.notifyDataSetChanged();
                    });
                }
                @Override
                public void onFailure(ErrorInfo errorInfo) {
                    Log.d("图片发送失败", errorInfo.toString() + errorInfo.getErrorDescription());
                }
            });
        }
        @Override
        public void onFailure(ErrorInfo errorInfo) {
            Log.d("图片上传失败", errorInfo.getErrorCode() + errorInfo.toString());
            runOnUiThread(() -> {
                Toast.makeText(getApplicationContext(), "图片上传失败:" + errorInfo.getErrorDescription(), Toast.LENGTH_SHORT).show();
            });
        }
    });
}

内容的提问来源于stack exchange,提问作者komal Jadhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:24:06