286 lines
8.9 KiB
Markdown
286 lines
8.9 KiB
Markdown
|
|
# Android端API路径修复指南
|
|||
|
|
|
|||
|
|
## 🎯 目标
|
|||
|
|
|
|||
|
|
将Android端的观看历史API调用路径修改为与zhibo-h后台匹配。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 需要修改的文件
|
|||
|
|
|
|||
|
|
### 文件1: ApiService.java
|
|||
|
|
|
|||
|
|
**位置**: `android-app/app/src/main/java/com/zbkj/front/net/ApiService.java`
|
|||
|
|
|
|||
|
|
#### 修改内容
|
|||
|
|
|
|||
|
|
找到以下接口定义并修改:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// ==================== 用户活动记录 ====================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取观看历史
|
|||
|
|
*/
|
|||
|
|
@GET("api/front/activity/view/history") // ← 修改这里:view-history 改为 view/history
|
|||
|
|
Call<ApiResponse<PageResponse<Map<String, Object>>>> getViewHistory(
|
|||
|
|
@Query("targetType") String targetType, // ← 修改这里:type 改为 targetType
|
|||
|
|
@Query("page") int page,
|
|||
|
|
@Query("pageSize") int pageSize);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 清除观看历史
|
|||
|
|
*/
|
|||
|
|
@DELETE("api/front/activity/view/history") // ← 修改这里:view-history 改为 view/history
|
|||
|
|
Call<ApiResponse<String>> clearViewHistory(@Query("targetType") String targetType); // ← 修改这里:type 改为 targetType
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取点赞记录
|
|||
|
|
*/
|
|||
|
|
@GET("api/front/activity/like/records") // ← 修改这里:like-records 改为 like/records
|
|||
|
|
Call<ApiResponse<PageResponse<Map<String, Object>>>> getLikeRecords(
|
|||
|
|
@Query("targetType") String targetType, // ← 修改这里:type 改为 targetType
|
|||
|
|
@Query("page") int page,
|
|||
|
|
@Query("pageSize") int pageSize);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取收藏的作品
|
|||
|
|
*/
|
|||
|
|
@GET("api/front/activity/collect/works") // ← 修改这里:collected-works 改为 collect/works
|
|||
|
|
Call<ApiResponse<PageResponse<Map<String, Object>>>> getCollectedWorks(
|
|||
|
|
@Query("page") int page,
|
|||
|
|
@Query("pageSize") int pageSize);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取关注记录
|
|||
|
|
*/
|
|||
|
|
@GET("api/front/activity/follow/records") // ← 修改这里:follow-records 改为 follow/records
|
|||
|
|
Call<ApiResponse<PageResponse<Map<String, Object>>>> getFollowRecords(
|
|||
|
|
@Query("page") int page,
|
|||
|
|
@Query("pageSize") int pageSize);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 记录观看历史(新版)
|
|||
|
|
*/
|
|||
|
|
@POST("api/front/activity/view/record") // ← 修改这里:record-view 改为 view/record
|
|||
|
|
Call<ApiResponse<Map<String, Object>>> recordViewHistoryNew(@Body Map<String, Object> body);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 调试Token
|
|||
|
|
*/
|
|||
|
|
@GET("api/front/activity/debug/token") // ← 修改这里:debug-token 改为 debug/token
|
|||
|
|
Call<ApiResponse<Map<String, Object>>> debugToken();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 文件2: RoomDetailActivity.java
|
|||
|
|
|
|||
|
|
**位置**: `android-app/app/src/main/java/com/zbkj/front/livestreaming/RoomDetailActivity.java`
|
|||
|
|
|
|||
|
|
#### 修改内容
|
|||
|
|
|
|||
|
|
找到 `recordWatchHistory()` 方法,确保参数名正确:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
private void recordWatchHistory() {
|
|||
|
|
try {
|
|||
|
|
if (!AuthHelper.isLoggedIn(this)) {
|
|||
|
|
return; // 未登录用户不记录
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (TextUtils.isEmpty(roomId)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ApiService apiService = ApiClient.getService(getApplicationContext());
|
|||
|
|
|
|||
|
|
// 使用新的统一观看历史API
|
|||
|
|
java.util.Map<String, Object> body = new java.util.HashMap<>();
|
|||
|
|
body.put("targetType", "room"); // ✅ 正确:targetType
|
|||
|
|
body.put("targetId", roomId);
|
|||
|
|
body.put("targetTitle", "直播间");
|
|||
|
|
body.put("duration", 0); // ✅ 正确:duration(不是viewDuration)
|
|||
|
|
|
|||
|
|
Call<ApiResponse<java.util.Map<String, Object>>> call = apiService.recordViewHistoryNew(body);
|
|||
|
|
|
|||
|
|
call.enqueue(new Callback<ApiResponse<java.util.Map<String, Object>>>() {
|
|||
|
|
@Override
|
|||
|
|
public void onResponse(Call<ApiResponse<java.util.Map<String, Object>>> call,
|
|||
|
|
Response<ApiResponse<java.util.Map<String, Object>>> response) {
|
|||
|
|
if (response.isSuccessful() && response.body() != null && response.body().isOk()) {
|
|||
|
|
android.util.Log.d("RoomDetail", "观看历史记录成功");
|
|||
|
|
// 房间信息加载后更新观看历史
|
|||
|
|
updateWatchHistoryWithRoomInfo();
|
|||
|
|
} else {
|
|||
|
|
android.util.Log.w("RoomDetail", "记录观看历史失败: " +
|
|||
|
|
(response.body() != null ? response.body().getMessage() : "unknown"));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void onFailure(Call<ApiResponse<java.util.Map<String, Object>>> call, Throwable t) {
|
|||
|
|
// 忽略错误,不影响直播观看
|
|||
|
|
android.util.Log.w("RoomDetail", "记录观看历史失败: " + t.getMessage());
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
// 忽略所有异常,不影响直播观看
|
|||
|
|
android.util.Log.w("RoomDetail", "记录观看历史失败: " + e.getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
找到 `updateWatchHistoryWithRoomInfo()` 方法,确保参数名正确:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
private void updateWatchHistoryWithRoomInfo() {
|
|||
|
|
if (room == null || !AuthHelper.isLoggedIn(this)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
ApiService apiService = ApiClient.getService(getApplicationContext());
|
|||
|
|
|
|||
|
|
java.util.Map<String, Object> body = new java.util.HashMap<>();
|
|||
|
|
body.put("targetType", "room"); // ✅ 正确:targetType
|
|||
|
|
body.put("targetId", roomId);
|
|||
|
|
body.put("targetTitle", room.getTitle() != null ? room.getTitle() : "直播间");
|
|||
|
|
body.put("duration", 0); // ✅ 正确:duration(不是viewDuration)
|
|||
|
|
|
|||
|
|
apiService.recordViewHistoryNew(body).enqueue(new Callback<ApiResponse<java.util.Map<String, Object>>>() {
|
|||
|
|
@Override
|
|||
|
|
public void onResponse(Call<ApiResponse<java.util.Map<String, Object>>> call,
|
|||
|
|
Response<ApiResponse<java.util.Map<String, Object>>> response) {
|
|||
|
|
if (response.isSuccessful() && response.body() != null && response.body().isOk()) {
|
|||
|
|
android.util.Log.d("RoomDetail", "观看历史更新成功");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void onFailure(Call<ApiResponse<java.util.Map<String, Object>>> call, Throwable t) {
|
|||
|
|
// 忽略错误
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
// 忽略所有异常
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 修改对比表
|
|||
|
|
|
|||
|
|
| 功能 | 旧路径(错误) | 新路径(正确) | 参数变化 |
|
|||
|
|
|------|--------------|--------------|---------|
|
|||
|
|
| 记录观看历史 | `/activity/record-view` | `/activity/view/record` | - |
|
|||
|
|
| 获取观看历史 | `/activity/view-history` | `/activity/view/history` | `type` → `targetType` |
|
|||
|
|
| 清除观看历史 | `/activity/view-history` | `/activity/view/history` | `type` → `targetType` |
|
|||
|
|
| 获取点赞记录 | `/activity/like-records` | `/activity/like/records` | `type` → `targetType` |
|
|||
|
|
| 获取收藏记录 | `/activity/collected-works` | `/activity/collect/works` | - |
|
|||
|
|
| 获取关注记录 | `/activity/follow-records` | `/activity/follow/records` | - |
|
|||
|
|
| Token调试 | `/activity/debug-token` | `/activity/debug/token` | - |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 修改检查清单
|
|||
|
|
|
|||
|
|
- [ ] 修改 `ApiService.java` 中的所有API路径
|
|||
|
|
- [ ] 修改 `ApiService.java` 中的参数名(`type` → `targetType`)
|
|||
|
|
- [ ] 检查 `RoomDetailActivity.java` 中的参数名(`duration` 不是 `viewDuration`)
|
|||
|
|
- [ ] 重新编译Android应用
|
|||
|
|
- [ ] 测试记录观看历史功能
|
|||
|
|
- [ ] 测试查看观看历史功能
|
|||
|
|
- [ ] 检查日志输出
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 测试步骤
|
|||
|
|
|
|||
|
|
### 1. 编译应用
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd android-app
|
|||
|
|
./gradlew assembleDebug
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 安装并运行
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
adb install -r app/build/outputs/apk/debug/app-debug.apk
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 测试流程
|
|||
|
|
|
|||
|
|
1. **登录应用**
|
|||
|
|
- 确保使用有效的账号登录
|
|||
|
|
|
|||
|
|
2. **进入直播间**
|
|||
|
|
- 选择任意直播间进入
|
|||
|
|
- 查看Logcat日志,搜索 "观看历史"
|
|||
|
|
|
|||
|
|
3. **检查日志**
|
|||
|
|
```
|
|||
|
|
RoomDetail: 观看历史记录成功
|
|||
|
|
RoomDetail: 观看历史更新成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **查看历史记录**
|
|||
|
|
- 返回首页
|
|||
|
|
- 进入"我的" → "我的记录"
|
|||
|
|
- 切换到"观看历史"标签页
|
|||
|
|
- 应该能看到刚才观看的直播间
|
|||
|
|
|
|||
|
|
### 4. 调试Token(如果有问题)
|
|||
|
|
|
|||
|
|
使用Postman或curl测试:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://1.15.149.240:8081/api/front/activity/debug/token" \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐛 常见问题
|
|||
|
|
|
|||
|
|
### 问题1:401 未登录
|
|||
|
|
|
|||
|
|
**原因**: Token未正确传递
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 检查 `ApiClient.java` 中的Token拦截器
|
|||
|
|
2. 确保Token格式正确:`Bearer {token}`
|
|||
|
|
3. 使用 `/activity/debug/token` 接口验证
|
|||
|
|
|
|||
|
|
### 问题2:404 Not Found
|
|||
|
|
|
|||
|
|
**原因**: API路径错误
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 检查 `ApiService.java` 中的路径是否正确
|
|||
|
|
2. 确保使用 `/` 而不是 `-`
|
|||
|
|
3. 检查后台服务是否运行在8081端口
|
|||
|
|
|
|||
|
|
### 问题3:参数错误
|
|||
|
|
|
|||
|
|
**原因**: 参数名不匹配
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 确保使用 `targetType` 而不是 `type`
|
|||
|
|
2. 确保使用 `duration` 而不是 `viewDuration`
|
|||
|
|
3. 检查后台日志
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 相关文档
|
|||
|
|
|
|||
|
|
- [观看历史功能-zhibo-h后台说明.md](./观看历史功能-zhibo-h后台说明.md)
|
|||
|
|
- [观看历史功能-快速指南.md](./观看历史功能-快速指南.md)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**最后更新**: 2026-01-05
|
|||
|
|
**状态**: 📝 待修改
|