新增AiCareScheduler.java,AI关怀调度器,负责规划和调度关怀任务,实现主动随机关怀 #40

Merged
pjao9fvxr merged 2 commits from zhouzexin_branch into master 4 weeks ago

@ -0,0 +1,53 @@
package net.micode.notes.tool.ai;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import java.util.Calendar;
import java.util.Random;
public class AiCareScheduler {
public static final String ACTION_AI_CARE = "net.micode.notes.ACTION_AI_CARE";
/**
* 怀
* App
*/
public static void scheduleDailyCare(Context context) {
// 1. 设置固定时间点:早安 (07:30) 和 晚安 (22:30)
setCareAlarm(context, 7, 30, "morning", 10001);
setCareAlarm(context, 22, 30, "night", 10002);
// 2. 设置伪随机时间点:在 10:00 - 18:00 之间随机选 2 个点
Random random = new Random();
for (int i = 0; i < 2; i++) {
int hour = 10 + random.nextInt(8); // 10-17点
int minute = random.nextInt(60);
setCareAlarm(context, hour, minute, "random", 20001 + i);
}
}
private static void setCareAlarm(Context context, int hour, int minute, String type, int requestCode) {
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, 0);
// 如果设定的时间已经过了,就设为明天
if (cal.getTimeInMillis() < System.currentTimeMillis()) {
cal.add(Calendar.DAY_OF_YEAR, 1);
}
Intent intent = new Intent(context, AiReminderReceiver.class); // 复用 Receiver
intent.setAction(ACTION_AI_CARE);
intent.putExtra("care_type", type);
PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
// 使用非精准闹钟即可(省电且不需要秒级精确)
am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
}
}

@ -1,18 +1,31 @@
package net.micode.notes.tool.ai;
import com.google.gson.JsonObject;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface CozeApiService {
/**
*
* https://www.coze.cn/open/docs/developer_guides/chat
*/
@POST("v3/chat")
Call<CozeResponse> chat(
Call<CozeResponse> chat(@Header("Authorization") String token, @Body CozeRequest request);
// [核心修复] 轮询接口:使用 Query 参数传递 IDs
@POST("v3/chat/retrieve")
Call<CozeResponse> retrieveChat(
@Header("Authorization") String token,
@Query("chat_id") String chatId,
@Query("conversation_id") String conversationId
);
// [核心新增] 获取消息列表:用于抓取 AI 的文本回复
@GET("v3/chat/message/list")
Call<com.google.gson.JsonObject> getMessageList(
@Header("Authorization") String token,
@Body CozeRequest request
@Query("chat_id") String chatId,
@Query("conversation_id") String conversationId
);
}

@ -14,13 +14,8 @@ public class CozeResponse {
public ChatData data;
public static class ChatData {
@SerializedName("id")
public String id; // 会话ID
@SerializedName("status")
public String status; // 状态completed, in_progress等
// 注意:非流式模式下,回复通常在后续的消息查询中或特定的 V3 响应字段中
// 为了简化 Demo我们假设智能体立即返回了结果
public String id; // chat_id
public String conversation_id; // [核心修复] 必须添加此字段
public String status;
}
}
Loading…
Cancel
Save