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:
@@ -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();
|
||||
|
||||
/**
|
||||
* 后台任务事件类型
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user