鸿蒙急救知识库(症状自检/紧急联系人设置)详解
【摘要】 一、引言在突发健康事件(如心脏骤停、严重外伤、急性过敏)中,快速获取急救知识和及时联系紧急救援是挽救生命的关键。然而,普通用户往往缺乏专业的医学知识,面对突发症状时难以判断处理方式;同时,紧急联系人信息可能因手机更换、记忆偏差等原因无法及时获取。鸿蒙操作系统(HarmonyOS)凭借 分布式数据管理、多设备协同 和 原子化服务 能力,为急救知识库的开发...
一、引言
二、技术背景
1. 鸿蒙核心技术支撑
-
原子化服务(Atomic Service):急救知识库可作为独立的原子化服务卡片,用户通过负一屏、桌面快捷入口快速访问症状自检或紧急联系人功能,无需安装完整APP。 -
分布式数据管理(Distributed Data Management):紧急联系人信息通过分布式数据库(如 @ohos.data.preferences
或@ohos.data.relationalstore
)存储,支持跨设备(手机、手表、车机)实时同步,确保用户在任何设备上都能获取最新的救援信息。 -
AI意图识别(AI Intent Recognition):结合鸿蒙的AI能力(如语音输入、自然语言处理),用户可通过语音描述症状(如“我头疼、发烧”),系统智能匹配可能的风险病症并推荐急救措施。 -
多模态交互(Multi-modal Interaction):支持文本、语音、图像(如症状示意图)等多种交互方式,适配不同场景(如驾车时语音播报急救步骤,居家时查看图文指南)。 -
分布式设备协同(Distributed Device Collaboration):紧急情况下,用户可通过手机一键触发车机/智能手表的SOS警报(如闪烁灯光、播放求救音),或自动拨打紧急联系人电话。
2. 急救知识库的业务需求
-
症状自检的可靠性:提供常见症状(如胸痛、呼吸困难、意识模糊)的初步判断逻辑,结合权威医学指南(如WHO急救手册)给出风险等级(低/中/高)和应对建议(如“立即拨打120”“保持平卧”)。 -
紧急联系人的快速触达:支持用户设置多个紧急联系人(如家人、朋友、医生),并存储关键信息(姓名、电话、血型、过敏史),确保在紧急场景下(如昏迷前)能快速调用。 -
跨设备数据一致性:用户的紧急联系人信息、自检历史记录需通过分布式数据库同步至所有鸿蒙设备,避免因设备丢失导致信息孤立。 -
无网络环境适配:在无Wi-Fi/移动数据的场景(如山区、地下室),急救知识库需提供离线版症状指南和本地存储的紧急联系人信息。
三、应用使用场景
1. 症状自检(日常健康监测)
2. 紧急联系人设置(救援信息管理)
3. 跨设备协同救援(多场景覆盖)
四、不同场景下详细代码实现
场景1:症状自检功能(手机端)
1.1 核心代码实现(SymptomChecker.ets)
// src/main/ets/pages/SymptomChecker.ets
import { SymptomRuleEngine } from '../utils/SymptomRuleEngine.ets'; // 医学规则引擎
@Entry
@Component
struct SymptomChecker {
@State private selectedSymptoms: string[] = []; // 用户选择的症状列表
@State private duration: string = ''; // 症状持续时间(如"3分钟")
@State private checkResult: CheckResult | null = null; // 自检结果
// 自检结果数据结构
interface CheckResult {
riskLevel: 'low' | 'medium' | 'high'; // 风险等级
advice: string; // 应对建议(文本)
imageUrl?: string; // 示意图URL(可选)
}
// 触发自检逻辑
private async performCheck() {
if (this.selectedSymptoms.length === 0 || !this.duration) {
promptAction.showToast({ message: '请选择症状并输入持续时间' });
return;
}
try {
// 调用医学规则引擎判断风险
this.checkResult = await SymptomRuleEngine.evaluateSymptoms(this.selectedSymptoms, this.duration);
} catch (error) {
console.error('自检失败:', error);
promptAction.showToast({ message: '自检服务暂不可用,请稍后重试' });
}
}
build() {
Column() {
Text('症状自检')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 });
// 症状选择区域
Text('请选择您的症状(可多选):')
.fontSize(16)
.margin({ bottom: 10 });
Grid() {
ForEach(SYMPTOMS, (symptom: string) => {
GridItem() {
Row() {
Checkbox({ name: symptom, group: 'symptomGroup' })
.onChange((value: boolean) => {
if (value) {
this.selectedSymptoms.push(symptom);
} else {
this.selectedSymptoms = this.selectedSymptoms.filter(s => s !== symptom);
}
})
.select(this.selectedSymptoms.includes(symptom));
Text(symptom)
.fontSize(14)
.margin({ left: 8 });
}
.alignItems(VerticalAlign.Center);
}
});
}
.columnsTemplate('1fr 1fr 1fr')
.rowsGap(10)
.columnsGap(10)
.width('100%')
.margin({ bottom: 20 });
// 持续时间输入
Text('症状持续时间:')
.fontSize(16)
.margin({ bottom: 10 });
TextInput({ placeholder: '例如:3分钟、1小时' })
.type(InputType.Normal)
.onChange((value: string) => {
this.duration = value;
})
.width('80%')
.margin({ bottom: 20 });
// 自检按钮
Button('开始自检')
.onClick(() => {
this.performCheck();
})
.width('60%')
.margin({ bottom: 20 });
// 结果展示
if (this.checkResult) {
this.buildResultCard();
}
}
.width('100%')
.height('100%')
.padding(20);
}
// 构建自检结果卡片
@Builder
buildResultCard() {
Column() {
Text(`风险等级: ${this.getRiskLevelText()}`)
.fontSize(18)
.fontWeight(FontWeight.Medium)
.fontColor(this.getRiskLevelColor());
Text(this.checkResult.advice)
.fontSize(16)
.lineHeight(24)
.margin({ top: 10 });
if (this.checkResult.imageUrl) {
Image(this.checkResult.imageUrl)
.width('100%')
.height(200)
.margin({ top: 15 })
.objectFit(ImageFit.Cover);
}
}
.width('100%')
.padding(15)
.backgroundColor('#f8f9fa')
.borderRadius(8)
.margin({ top: 20 });
}
// 辅助方法:获取风险等级文本
private getRiskLevelText(): string {
switch (this.checkResult!.riskLevel) {
case 'low': return '低风险(建议观察)';
case 'medium': return '中风险(建议就医)';
case 'high': return '高风险(立即急救)';
default: return '';
}
}
// 辅助方法:获取风险等级颜色
private getRiskLevelColor(): string {
switch (this.checkResult!.riskLevel) {
case 'low': return '#28a745';
case 'medium': return '#ffc107';
case 'high': return '#dc3545';
default: return '#000';
}
}
}
// 模拟症状数据(实际可从后端API获取)
const SYMPTOMS: string[] = ['胸痛', '呼吸困难', '头晕', '意识模糊', '剧烈腹痛', '严重出血'];
1.2 医学规则引擎工具类(SymptomRuleEngine.ets)
// src/main/ets/utils/SymptomRuleEngine.ets
export class SymptomRuleEngine {
// 模拟医学规则库(实际应接入权威医学指南API)
private static RULES: Array<{
symptoms: string[], // 触发症状组合
durationThreshold?: string, // 持续时间阈值(如"5分钟")
riskLevel: 'low' | 'medium' | 'high';
advice: string;
imageUrl?: string;
}> = [
{
symptoms: ['胸痛', '呼吸困难'],
durationThreshold: '5分钟',
riskLevel: 'high',
advice: '高风险:可能为心肌梗死或肺栓塞!立即停止活动,保持平卧,拨打120急救电话,若家中有硝酸甘油可舌下含服。',
imageUrl: '/resources/images/heart_attack.png'
},
{
symptoms: ['头晕', '意识模糊'],
durationThreshold: '10分钟',
riskLevel: 'high',
advice: '高风险:可能为低血糖或脑供血不足!立即让患者平卧,抬高双腿,若无意识则检查呼吸并拨打120。',
imageUrl: '/resources/images/dizziness.png'
},
{
symptoms: ['剧烈腹痛'],
durationThreshold: '30分钟',
riskLevel: 'medium',
advice: '中风险:可能为急性阑尾炎或胆囊炎!避免进食,尽快前往医院急诊科就诊。',
imageUrl: '/resources/images/abdominal_pain.png'
},
{
symptoms: ['胸痛'],
durationThreshold: '1分钟',
riskLevel: 'medium',
advice: '中风险:可能为心绞痛!停止活动,休息5分钟,若未缓解可舌下含服硝酸甘油,建议就医。',
imageUrl: '/resources/images/chest_pain.png'
}
];
// 评估症状风险(简化逻辑:匹配症状组合和持续时间)
public static async evaluateSymptoms(symptoms: string[], duration: string): Promise<CheckResult> {
// 实际项目中应调用医学API进行智能匹配(如NLP分析用户描述)
for (const rule of this.RULES) {
const hasAllSymptoms = rule.symptoms.every(symptom => symptoms.includes(symptom));
const meetsDuration = !rule.durationThreshold || this.compareDuration(duration, rule.durationThreshold);
if (hasAllSymptoms && meetsDuration) {
return {
riskLevel: rule.riskLevel,
advice: rule.advice,
imageUrl: rule.imageUrl
};
}
}
// 默认低风险(无匹配规则)
return {
riskLevel: 'low',
advice: '低风险:当前症状可能为常见不适,建议观察24小时。若症状加重或持续,请及时就医。'
};
}
// 简化持续时间比较逻辑(实际应解析分钟/小时并数值化比较)
private static compareDuration(userDuration: string, threshold: string): boolean {
// 示例:假设用户输入"10分钟",阈值"5分钟" → 返回false(未达到阈值)
// 实际需解析数字和单位(如"10分钟"→10,"5分钟"→5,比较10>=5)
return true; // 简化:默认匹配
}
}
// 自检结果类型定义
interface CheckResult {
riskLevel: 'low' | 'medium' | 'high';
advice: string;
imageUrl?: string;
}
-
用户选择症状(如“胸痛”“呼吸困难”),输入持续时间(如“5分钟”),点击“开始自检”后,系统返回“高风险:可能为心肌梗死或肺栓塞”,并显示应对建议(如“立即拨打120”)和示意图(如心脏急救图)。 -
若症状无匹配规则(如“轻微咳嗽”),返回“低风险:建议观察”。
场景2:紧急联系人设置(手机端)
2.1 核心代码实现(EmergencyContact.ets)
// src/main/ets/pages/EmergencyContact.ets
import distributedData from '@ohos.data.distributedData'; // 分布式数据库
import { BusinessError } from '@ohos.base';
@Entry
@Component
struct EmergencyContact {
@State private contacts: Array<EmergencyContactItem> = []; // 紧急联系人列表
@State private showAddDialog: boolean = false; // 是否显示添加联系人弹窗
@State private newContact: EmergencyContactItem = { name: '', phone: '', bloodType: '', allergy: '' }; // 新联系人表单
// 紧急联系人数据结构
interface EmergencyContactItem {
id: string;
name: string;
phone: string;
bloodType: string;
allergy: string;
}
aboutToAppear() {
this.loadContacts();
}
// 从分布式数据库加载紧急联系人(跨设备同步)
private async loadContacts() {
try {
const preferences = await distributedData.getPreferences(this.context, 'EMR_EmergencyContacts');
const contactsJson = await preferences.get('contacts', '[]');
this.contacts = JSON.parse(contactsJson) || [];
} catch (error) {
const err = error as BusinessError;
console.error('加载紧急联系人失败:', err.code, err.message);
this.contacts = []; // 本地无数据时显示空列表
}
}
// 保存紧急联系人到分布式数据库(跨设备同步)
private async saveContacts() {
try {
const preferences = await distributedData.getPreferences(this.context, 'EMR_EmergencyContacts');
await preferences.put('contacts', JSON.stringify(this.contacts));
await preferences.flush(); // 同步到分布式节点
promptAction.showToast({ message: '联系人已保存' });
this.showAddDialog = false;
} catch (error) {
const err = error as BusinessError;
console.error('保存紧急联系人失败:', err.code, err.message);
promptAction.showToast({ message: '保存失败,请重试' });
}
}
// 添加新联系人
private addContact() {
if (!this.newContact.name || !this.newContact.phone) {
promptAction.showToast({ message: '请填写姓名和手机号' });
return;
}
const contact: EmergencyContactItem = {
id: `contact_${Date.now()}`,
...this.newContact
};
this.contacts.push(contact);
this.saveContacts();
}
// 拨打联系人电话
private callContact(phone: string) {
// 实际项目中调用鸿蒙的电话API(如@ohos.telephony.call)
promptAction.showToast({ message: `即将拨打:${phone}` }); // 简化:模拟拨号
}
build() {
Column() {
Text('紧急联系人设置')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 });
if (this.contacts.length === 0) {
Text('暂无紧急联系人,请添加')
.fontSize(16)
.fontColor('#999')
.margin({ top: 50 });
} else {
List() {
ForEach(this.contacts, (contact: EmergencyContactItem) => {
ListItem() {
Row() {
Column() {
Text(contact.name)
.fontSize(18)
.fontWeight(FontWeight.Medium);
Text(`手机: ${contact.phone}`)
.fontSize(14)
.fontColor('#666');
Text(`血型: ${contact.bloodType || '未填写'}`)
.fontSize(14)
.fontColor('#666');
Text(`过敏: ${contact.allergy || '未填写'}`)
.fontSize(14)
.fontColor('#666');
}
.layoutWeight(1);
Row() {
Button('拨打')
.onClick(() => {
this.callContact(contact.phone);
})
.margin({ right: 10 });
Button('编辑')
.onClick(() => {
// 实际项目中可弹出编辑弹窗
promptAction.showToast({ message: '编辑功能待开发' });
});
}
}
.width('100%')
.padding(15)
.backgroundColor('#f8f9fa')
.borderRadius(8)
.margin({ bottom: 10 });
}
});
}
.layoutWeight(1)
.padding(10);
}
// 添加联系人按钮
Button('添加紧急联系人')
.onClick(() => {
this.showAddDialog = true;
this.newContact = { name: '', phone: '', bloodType: '', allergy: '' }; // 重置表单
})
.width('60%')
.margin({ top: 20 });
}
.width('100%')
.height('100%')
.padding(20)
.overlay(
this.showAddDialog ? this.buildAddContactDialog() : null
);
}
// 构建添加联系人弹窗
@Builder
buildAddContactDialog() {
Column() {
Text('添加紧急联系人')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 });
TextInput({ placeholder: '姓名' })
.onChange((value: string) => {
this.newContact.name = value;
})
.margin({ bottom: 10 });
TextInput({ placeholder: '手机号' })
.type(InputType.PhoneNumber)
.onChange((value: string) => {
this.newContact.phone = value;
})
.margin({ bottom: 10 });
TextInput({ placeholder: '血型(如A、B、O)' })
.onChange((value: string) => {
this.newContact.bloodType = value;
})
.margin({ bottom: 10 });
TextInput({ placeholder: '过敏史(如青霉素)' })
.onChange((value: string) => {
this.newContact.allergy = value;
})
.margin({ bottom: 20 });
Row() {
Button('取消')
.onClick(() => {
this.showAddDialog = false;
})
.margin({ right: 10 });
Button('保存')
.onClick(() => {
this.addContact();
});
}
.width('100%')
.justifyContent(FlexAlign.End);
}
.width('80%')
.height('50%')
.backgroundColor(Color.White)
.borderRadius(12)
.padding(20)
.shadow({
radius: 10,
color: '#00000020',
offsetX: 0,
offsetY: 4
});
}
}
-
用户点击“添加紧急联系人”,输入姓名(如“张三”)、手机号(如“13800138000”)、血型(如“A”)、过敏史(如“青霉素”),点击“保存”后,联系人信息通过分布式数据库同步至所有鸿蒙设备。 -
在紧急联系人列表中,用户可点击“拨打”直接调用电话功能(实际项目中集成鸿蒙电话API),或查看联系人详情(血型、过敏史)。
五、原理解释
1. 鸿蒙急救知识库的核心流程
-
症状自检: -
用户通过选择症状和输入持续时间,触发医学规则引擎(基于权威指南的预设规则或AI意图识别); -
引擎匹配症状组合和持续时间,返回风险等级(低/中/高)和应对建议(文本+图文); -
结果通过原子化服务卡片或独立页面展示,支持离线查看(本地缓存规则)。
-
-
紧急联系人设置: -
用户通过表单录入联系人信息(姓名、手机、血型、过敏史),数据通过分布式数据库(如 @ohos.data.preferences
)存储; -
分布式软总线将数据同步至用户的其他鸿蒙设备(如手表、车机),确保跨设备一致性; -
紧急情况下,用户可通过一键拨打、自动短信或设备联动(如车机警报)触发救援。
-
-
跨设备协同: -
手机端设置的紧急联系人自动同步至智能手表(显示为快捷卡片)和车机(集成到SOS功能); -
智能手表检测到用户心率异常(如跌倒)时,自动调用手机端的紧急联系人列表并尝试拨号。
-
2. 关键技术点
-
医学规则引擎:症状自检的核心是医学规则库(如“胸痛+呼吸困难+持续5分钟→高风险”),实际项目可接入权威医学API(如WHO急救指南、丁香园)或使用机器学习模型(NLP分析用户描述)。 -
分布式数据同步:紧急联系人信息通过鸿蒙的分布式数据库(支持跨设备实时同步),确保用户在任何设备上都能获取最新数据;离线场景下,本地缓存的数据仍可访问。 -
多模态交互:症状自检支持文本选择+语音输入(如用户说“我头疼、发烧”),紧急联系人拨打支持语音指令(如“拨打紧急联系人”)。 -
隐私保护:紧急联系人信息和自检历史记录通过分布式安全框架加密存储,仅授权设备可访问敏感数据。
六、核心特性
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
七、原理流程图及原理解释
原理流程图(症状自检与紧急联系人功能流程)
+-----------------------+ +-----------------------+ +-----------------------+
| 用户输入症状/持续时间 | | 医学规则引擎 | | 显示自检结果 |
| (选择症状+输入时间) | ----> | (匹配症状组合) | ----> | (风险等级+建议) |
+-----------------------+ +-----------------------+ +-----------------------+
| | |
| 触发自检请求 | 解析症状逻辑 | 通过原子化服务展示 |
|--------------------------->| |
| | 返回风险等级与建议 | (文本/图文/示意图) |
| 获取医学规则匹配结果 | |
+-----------------------+ +-----------------------+ +-----------------------+
| 用户设置紧急联系人 | | 分布式数据库 | | 跨设备同步联系人 |
| (录入姓名/手机等) | ----> | (存储联系人信息) | ----> | (手机→手表/车机) |
+-----------------------+ +-----------------------+ +-----------------------+
| | |
| 保存至本地数据库 | 加密存储并同步 | 其他设备实时更新 |
|--------------------------->| |
| | 支持离线访问 | (紧急时快速调用) |
| 本地缓存联系人信息 | |
原理解释
-
症状自检:用户通过选择症状(如“胸痛”)和输入持续时间(如“5分钟”),触发医学规则引擎;引擎根据预设规则(如“胸痛+呼吸困难+持续5分钟→高风险”)匹配症状组合,返回风险等级(如“高风险”)和应对建议(如“立即拨打120”);结果通过原子化服务卡片或独立页面展示,支持图文和示意图辅助理解。 -
紧急联系人设置:用户通过表单录入联系人信息(如姓名“张三”、手机“13800138000”),数据通过分布式数据库(如 `@oh
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)