M1.3 — Share Sheet + OCR

קליטת דוח Mi Home כתמונה במקום BLE direct · S400 MJTZC01YM
למה זה עדיף על כל ה־options הקודמים
  • 0 reverse-engineering של Xiaomi Cloud → לעולם לא נשבר כש־Xiaomi משנים API
  • משתמש במנגנון Android סטנדרטיintent-filter ACTION_SEND — כל אפליקציה משתפת תמונות יודעת לעבוד איתו
  • הלייאאוט של דוח Mi Home קבוע ובאנגלית → OCR + regex על תוויות שדה הוא אמין יחסית
  • הדוח נותן יותר מ-BLE — שדות שלא היו אפילו בפרוטוקול הישן (Body age, Heart rate)
  • אין סיכון סקיוריטי של אחסון credentials של Xiaomi בטלפון
השדות שנשלפים מהדוח
שדה במודל BodyCompositionמה בתמונהדוגמה
weightWeight95.7 kg
bmiBMI29.9
bodyFatPctBody fat percentage28.2%
muscleMassKgMuscle mass65 kg
boneMassKgBone mineral content3.7 kg
waterPctBody water51.7%
bmrBasal metabolic rate1854 Kcal
visceralFatVisceral fat rating13
proteinPctProtein percentage15.4%
metabolicAgeBody age34
leanBodyMassKgFat-free body weight68.7 kg
skeletalMusclePctSkeletal muscle mass (נגזר)36 kg
subcutaneousFatPct(נגזר מ־body fat)~22.6%
NEW: heartRateBpmHeart rate71 bpm

השדה החדש heartRateBpm דורש הוספה למודל BodyComposition + ל־Firestore schema. בונוס שלא היה אפילו ב־BLE protocol.

ארכיטקטורת ה־Flow
Mi Home → [Share button ↑] ↓ Android Share Sheet → VitVital (rgistered as image/* target) ↓ ShareReceiverScreen ← receives Uri to PNG/JPEG ↓ Preview + "Process" button (user confirms it's the right image) ↓ OCR engine → raw text blocks with bounding boxes ↓ MiHomeReportParser → regex on English labels, value+unit extraction ↓ Sanity checks (5 < weight < 300, 5% < bodyFat < 60%, ...) ↓ ConfirmDialog image side-by-side with parsed fields, user can edit ↓ Firestore body_composition + Health Connect WRITE_WEIGHT
צעדים טכניים
  1. Android intent-filter ב־AndroidManifest.xml: action.SEND + mimeType image/*
  2. Package ל־receive intent: receive_sharing_intent נכשל בעבר (JVM conflict, M1.5). חלופה: share_handler או platform-channel ידני
  3. OCR: google_mlkit_text_recognition — on-device, חינם, מהיר
  4. Parser: regex per־שדה (/Body fat percentage[\s\S]*?(\d+\.\d+)%/)
  5. Model update: הוספת heartRateBpm ל־BodyComposition + ל־Firestore mapping
  6. BodySource: ערך חדש .miHomeShare (במקום .miScale שהיה ל־BLE)
לאישור — 3 הכרעות לפני שאני מתחיל
1 · מנוע OCR

Google ML Kit on-device (מומלץ) — חינם, מהיר (~200ms), פרטיות מלאה, מתאים ללייאאוט קבוע כמו Mi Home
או Gemini Vision API — דיוק גבוה יותר, אבל cloud + עלות + תמונה עוזבת המכשיר

המלצה: ML Kit. הלייאוט קבוע ולא צריך understanding — רק קריאת מילים ומספרים.

2 · דיאלוג אישור אחרי OCR

תמיד להציג דיאלוג עם התמונה + הערכים השלופים, ולתת לערוך לפני שמירה
או לדלג אוטומטית כש־confidence>95% וסניטי תקין, ולהציג רק במקרי ספק

המלצה: תמיד להציג. שקילה זה event נדיר (פעם בכמה ימים) — שניית אישור נוספת לא מפריעה.

3 · אחסון התמונה המקור

Firebase Storage — שומר את ה־PNG ב־users/{uid}/body_composition/{docId}/source.png. מאפשר אימות עתידי אם מתגלים מקרי קצה
או לא לשמור — תמונה מקומית נמחקת אחרי שמירה. חוסך אחסון + מהיר + פחות רגיש לפרטיות

המלצה: לא לשמור. אם ה־parser תקין אין צורך, וזה גם הרבה storage לאורך זמן.

השלב הבא

אתה מאשר את 3 ההכרעות (או בוחר אחרת). כברירת מחדל אזוז עם ML Kit + תמיד דיאלוג אישור + לא לשמור תמונה.

אני אז מבצע:

  • הוספת google_mlkit_text_recognition + share_handler ל־pubspec
  • intent-filter ב־AndroidManifest.xml + permission handling
  • קובץ חדש: lib/services/mi_home_report_parser.dart — OCR + regex לשלוש שדות
  • מסך חדש: lib/screens/body/share_receiver_screen.dart + דיאלוג אישור
  • עדכון BodyComposition — הוספת heartRateBpm + ערך enum חדש BodySource.miHomeShare
  • מחיקת השכבת BLE (mi_scale_service.dart יהפוך deprecated/יוסר) — כיוון שלא יעבוד עם ה־S400 הזה
  • בנייה + ארכוב APK ישן + מסירת APK חדש לבדיקה

אומדן: 2-3 שעות עבודה. הבדיקה האמיתית היא עליך — לשקול ב־Mi Home ולשתף את הדוח לאפליקציה.