From 7d1896d9d2262f396a7744bdebb7cd07bfd1e32b Mon Sep 17 00:00:00 2001 From: xiao12feng8 <16507319+xiao12feng8@user.noreply.gitee.com> Date: Tue, 30 Dec 2025 10:10:35 +0800 Subject: [PATCH] =?UTF-8?q?bug=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=B8=8D=E8=83=BD=E6=AD=A3=E7=A1=AE=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/livestreaming/ChatMessage.java | 26 ++++++++++- .../livestreaming/ConversationActivity.java | 45 +++++++++++++++++-- .../ConversationMessagesAdapter.java | 3 +- .../livestreaming/RoomDetailActivity.java | 36 +++++++++------ .../example/livestreaming/net/ApiService.java | 5 --- 5 files changed, 92 insertions(+), 23 deletions(-) diff --git a/android-app/app/src/main/java/com/example/livestreaming/ChatMessage.java b/android-app/app/src/main/java/com/example/livestreaming/ChatMessage.java index bbf09bf1..c0dfecff 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/ChatMessage.java +++ b/android-app/app/src/main/java/com/example/livestreaming/ChatMessage.java @@ -25,6 +25,7 @@ public class ChatMessage { private long timestamp; private boolean isSystemMessage; private boolean isGiftMessage; // 是否是礼物消息 + private boolean isOutgoing; // 是否是自己发送的消息 private MessageStatus status; private String avatarUrl; // 发送者头像 URL,后续从后端获取 @@ -49,7 +50,8 @@ public class ChatMessage { this.isGiftMessage = false; this.messageType = MessageType.TEXT; // 如果是自己发送的消息,初始状态为发送中 - this.status = "我".equals(username) ? MessageStatus.SENDING : MessageStatus.SENT; + this.isOutgoing = "我".equals(username); + this.status = this.isOutgoing ? MessageStatus.SENDING : MessageStatus.SENT; } // 系统消息构造函数 @@ -86,6 +88,20 @@ public class ChatMessage { this.isSystemMessage = isSystemMessage; this.status = status; this.messageType = MessageType.TEXT; + this.isOutgoing = "我".equals(username); + } + + // 完整构造函数(从后端数据构造,带 isOutgoing 参数) + public ChatMessage(String messageId, String username, String message, long timestamp, + boolean isSystemMessage, MessageStatus status, boolean isOutgoing) { + this.messageId = messageId; + this.username = username; + this.message = message; + this.timestamp = timestamp; + this.isSystemMessage = isSystemMessage; + this.status = status; + this.messageType = MessageType.TEXT; + this.isOutgoing = isOutgoing; } // 图片消息构造函数 @@ -140,6 +156,14 @@ public class ChatMessage { isGiftMessage = giftMessage; } + public boolean isOutgoing() { + return isOutgoing; + } + + public void setOutgoing(boolean outgoing) { + isOutgoing = outgoing; + } + public MessageStatus getStatus() { return status; } diff --git a/android-app/app/src/main/java/com/example/livestreaming/ConversationActivity.java b/android-app/app/src/main/java/com/example/livestreaming/ConversationActivity.java index 451ff398..d2712b55 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/ConversationActivity.java +++ b/android-app/app/src/main/java/com/example/livestreaming/ConversationActivity.java @@ -181,7 +181,8 @@ public class ConversationActivity extends AppCompatActivity { return; } - String url = ApiConfig.getBaseUrl() + "/api/front/user/info"; + // 使用正确的用户信息接口 + String url = ApiConfig.getBaseUrl() + "/api/front/user"; Log.d(TAG, "获取用户信息: " + url); Request request = new Request.Builder() @@ -205,14 +206,31 @@ public class ConversationActivity extends AppCompatActivity { if (json.optInt("code", -1) == 200) { JSONObject data = json.optJSONObject("data"); if (data != null) { + // 尝试多种方式获取用户ID int uid = data.optInt("uid", 0); + if (uid == 0) { + uid = data.optInt("id", 0); + } + if (uid == 0) { + // 尝试从字符串解析 + String uidStr = data.optString("uid", ""); + if (!uidStr.isEmpty()) { + try { + uid = (int) Double.parseDouble(uidStr); + } catch (NumberFormatException e) { + Log.e(TAG, "解析uid失败: " + uidStr, e); + } + } + } if (uid > 0) { currentUserId = String.valueOf(uid); // 保存到 AuthStore - AuthStore.setUserInfo(ConversationActivity.this, currentUserId, data.optString("nickname", "")); + AuthStore.setUserInfo(ConversationActivity.this, currentUserId, data.optString("nickname", data.optString("nikeName", ""))); Log.d(TAG, "从服务器获取到用户ID: " + currentUserId); // 重新加载消息以正确显示 runOnUiThread(() -> loadMessagesFromServer()); + } else { + Log.w(TAG, "无法从响应中获取用户ID: " + body); } } } @@ -308,8 +326,28 @@ public class ConversationActivity extends AppCompatActivity { boolean isMine = false; if (myUserId != null && !myUserId.isEmpty() && senderId > 0) { - isMine = myUserId.equals(String.valueOf(senderId)); + // 处理可能的浮点数格式(如 "1.0" vs "1") + try { + int myUid = (int) Double.parseDouble(myUserId); + isMine = (myUid == senderId); + } catch (NumberFormatException e) { + isMine = myUserId.equals(String.valueOf(senderId)); + } } + + // 如果 senderId 为 0,尝试从 senderId 字段获取 + if (senderId == 0) { + senderId = item.optInt("senderId", 0); + if (myUserId != null && !myUserId.isEmpty() && senderId > 0) { + try { + int myUid = (int) Double.parseDouble(myUserId); + isMine = (myUid == senderId); + } catch (NumberFormatException e) { + isMine = myUserId.equals(String.valueOf(senderId)); + } + } + } + Log.d(TAG, "消息判断: myUserId=" + myUserId + ", senderId=" + senderId + ", isMine=" + isMine); String displayName = isMine ? "我" : username; @@ -327,6 +365,7 @@ public class ConversationActivity extends AppCompatActivity { } ChatMessage chatMessage = new ChatMessage(messageId, displayName, message, timestamp, isSystem, msgStatus); + chatMessage.setOutgoing(isMine); // 关键:设置消息方向,确保自己发送的消息显示在右侧 chatMessage.setAvatarUrl(avatarUrl); return chatMessage; } catch (Exception e) { diff --git a/android-app/app/src/main/java/com/example/livestreaming/ConversationMessagesAdapter.java b/android-app/app/src/main/java/com/example/livestreaming/ConversationMessagesAdapter.java index ec9fab4d..ffb54ce3 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/ConversationMessagesAdapter.java +++ b/android-app/app/src/main/java/com/example/livestreaming/ConversationMessagesAdapter.java @@ -70,7 +70,8 @@ public class ConversationMessagesAdapter extends ListAdapter 0 ? - String.valueOf(AuthStore.getUserId(this)) : + String userIdStr = AuthStore.getUserId(this); + String clientId = (userIdStr != null && !userIdStr.isEmpty()) ? + userIdStr : "guest_" + System.currentTimeMillis(); String wsUrl = WS_ONLINE_BASE_URL + roomId + "?clientId=" + clientId; @@ -1149,7 +1156,7 @@ public class RoomDetailActivity extends AppCompatActivity { } android.util.Log.d("RoomDetail", "成功加载 " + availableGifts.size() + " 个礼物"); } else { - android.util.Log.w("RoomDetail", "加载礼物列表失败: " + apiResponse.getMsg()); + android.util.Log.w("RoomDetail", "加载礼物列表失败: " + apiResponse.getMessage()); setDefaultGifts(); } } else { @@ -1485,7 +1492,7 @@ public class RoomDetailActivity extends AppCompatActivity { ApiService apiService = ApiClient.getService(this); OrderPayRequest payRequest = new OrderPayRequest(orderId, payType, payChannel); - Call> call = apiService.processPayment(payRequest); + Call> call = apiService.payment(payRequest); call.enqueue(new Callback>() { @Override @@ -1597,10 +1604,13 @@ public class RoomDetailActivity extends AppCompatActivity { ApiService apiService = ApiClient.getService(getApplicationContext()); - SendGiftRequest request = new SendGiftRequest(); - request.setRoomId(Integer.parseInt(roomId)); - request.setGiftId(Integer.parseInt(selectedGift.getId())); - request.setCount(count); + // 获取主播ID(使用房间ID作为主播ID,或者从房间信息中获取) + Integer streamerId = Integer.parseInt(roomId); + SendGiftRequest request = new SendGiftRequest( + Integer.parseInt(selectedGift.getId()), + streamerId, + count + ); Call> call = apiService.sendRoomGift(roomId, request); @@ -1635,7 +1645,7 @@ public class RoomDetailActivity extends AppCompatActivity { giftCountText.setText("1"); } else { Toast.makeText(RoomDetailActivity.this, - "赠送失败: " + apiResponse.getMsg(), + "赠送失败: " + apiResponse.getMessage(), Toast.LENGTH_SHORT).show(); } } else { @@ -1665,7 +1675,7 @@ public class RoomDetailActivity extends AppCompatActivity { ApiService apiService = ApiClient.getService(getApplicationContext()); java.util.Map body = new java.util.HashMap<>(); - body.put("streamerId", room.getStreamerId()); + body.put("streamerId", roomId); // 使用房间ID作为主播ID body.put("action", "follow"); Call>> call = apiService.followStreamer(body); @@ -1682,7 +1692,7 @@ public class RoomDetailActivity extends AppCompatActivity { binding.followButton.setEnabled(false); } else { Toast.makeText(RoomDetailActivity.this, - "关注失败: " + apiResponse.getMsg(), + "关注失败: " + apiResponse.getMessage(), Toast.LENGTH_SHORT).show(); } } else { @@ -1731,7 +1741,7 @@ public class RoomDetailActivity extends AppCompatActivity { fetchRoom(); } else { Toast.makeText(RoomDetailActivity.this, - "开始直播失败: " + apiResponse.getMsg(), + "开始直播失败: " + apiResponse.getMessage(), Toast.LENGTH_SHORT).show(); } } else { @@ -1785,7 +1795,7 @@ public class RoomDetailActivity extends AppCompatActivity { fetchRoom(); } else { Toast.makeText(RoomDetailActivity.this, - "结束直播失败: " + apiResponse.getMsg(), + "结束直播失败: " + apiResponse.getMessage(), Toast.LENGTH_SHORT).show(); } } else { diff --git a/android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java b/android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java index 8a5d0242..8de13724 100644 --- a/android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java +++ b/android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java @@ -373,10 +373,6 @@ public interface ApiService { Call> queryAliPayResult(@Query("orderNo") String orderNo); @POST("api/front/pay/payment") -<<<<<<< HEAD - Call> processPayment(@Body OrderPayRequest body); - -======= Call> payment(@Body OrderPayRequest body); // ==================== 分类管理 ==================== @@ -405,5 +401,4 @@ public interface ApiService { Call>> getChildCategories( @Path("parentId") Integer parentId, @Query("recursive") Boolean recursive); ->>>>>>> d8f9cc8959c6d8d0d49e022a1f05833053abb8be }