feat: 新增语音记录饮食功能与开发者调试模块

- 集成 @react-native-voice/voice 实现中文语音识别,支持“一句话记录”餐食
- 新增语音录制页面,含波形动画、音量反馈与识别结果确认
- FloatingFoodOverlay 新增语音入口,打通拍照/库/语音三种记录方式
- 添加麦克风与语音识别权限描述(iOS Info.plist 与 Android manifest)
- 实现开发者模式:连续三次点击用户名激活,含日志查看、导出与清除
- 新增 logger 工具类,统一日志存储(AsyncStorage)与按级别输出
- 重构 BackgroundTaskManager 为单例并支持 Promise 初始化,避免重复注册
- 移除 sleep-detail 多余渐变背景,改用 ThemedView 统一主题
- 新增通用 haptic 反馈函数,支持多种震动类型(iOS only)
- 升级 expo-background-task、expo-notifications、expo-task-manager 至兼容版本
This commit is contained in:
richarjiang
2025-09-11 19:11:09 +08:00
parent 35d6b74451
commit 3a4a55b78e
17 changed files with 1427 additions and 75 deletions

View File

@@ -1,11 +1,12 @@
import { store } from '@/store';
import { log } from '@/utils/logger';
import { StandReminderHelpers, WaterNotificationHelpers } from '@/utils/notificationHelpers';
import AsyncStorage from '@react-native-async-storage/async-storage';
import * as BackgroundTask from 'expo-background-task';
import * as TaskManager from 'expo-task-manager';
import { TaskManagerTaskBody } from 'expo-task-manager';
const BACKGROUND_TASK_IDENTIFIER = 'background-task';
export const BACKGROUND_TASK_IDENTIFIER = 'com.expo.modules.backgroundtask.processing';
@@ -183,36 +184,40 @@ export class BackgroundTaskManager {
/**
* 初始化后台任务管理器
*/
async initialize(): Promise<void> {
async initialize(innerAppMountedPromise: Promise<void>): Promise<void> {
if (this.isInitialized) {
console.log('后台任务管理器已初始化');
return;
}
try {
// 定义后台任务
TaskManager.defineTask(BACKGROUND_TASK_IDENTIFIER, async (body: TaskManagerTaskBody) => {
try {
console.log('[BackgroundTask] 后台任务执行');
log.info('[BackgroundTask] 后台任务执行');
await executeBackgroundTasks();
return BackgroundTask.BackgroundTaskResult.Success;
// return BackgroundTask.BackgroundTaskResult.Success;
} catch (error) {
console.error('[BackgroundTask] 任务执行失败:', error);
return BackgroundTask.BackgroundTaskResult.Failed;
// return BackgroundTask.BackgroundTaskResult.Failed;
}
});
if (await TaskManager.isTaskRegisteredAsync(BACKGROUND_TASK_IDENTIFIER)) {
log.info('[BackgroundTask] 任务已注册');
return
}
log.info('[BackgroundTask] 任务未注册, 开始注册...');
// 注册后台任务
const status = await BackgroundTask.registerTaskAsync(BACKGROUND_TASK_IDENTIFIER, {
await BackgroundTask.registerTaskAsync(BACKGROUND_TASK_IDENTIFIER, {
minimumInterval: 15,
});
console.log('[BackgroundTask] 配置状态:', status);
this.isInitialized = true;
console.log('后台任务管理器初始化完成');
log.info('后台任务管理器初始化完成');
} catch (error) {
console.error('初始化后台任务管理器失败:', error);
@@ -299,11 +304,6 @@ export class BackgroundTaskManager {
}
}
/**
* 后台任务管理器单例实例
*/
export const backgroundTaskManager = BackgroundTaskManager.getInstance();
/**
* 后台任务事件类型
*/