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的格式,无法得到预期的正常字节数组内容。
问题原因
- 你看到的
[B@xxxx格式不是返回值有问题,是Java中直接打印字节数组对象的默认toString()输出规则:[B代表字节数组类型,后面的十六进制字符串是对象的内存地址,不是数组实际内容。 - 代码中存在额外错误:直接将图片二进制字节数组转为普通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
相关产品推荐
相关产品推荐

