Car Messenger

Car Messenger מציע יכולות שליחת הודעות שמיועדות למכשירים לרכב. כמו באפליקציות אחרות לרכב, המשתמשים מפעילים את Car Messenger ממרכז האפליקציות.

מה חדש ב-Car Messenger?

באפליקציית Car Messenger החדשה, נהגים יכולים:

  • ליהנות מחוויה ייעודית של העברת הודעות.
  • מפעילים את Car Messenger ממרכז האפליקציות.
  • עיון בהודעות שהתקבלו לפני הנסיעה ובמהלכה.
  • להאזין להודעות ולענות להן.
  • להשתיק את ההתראות על הודעות.
  • להתחיל שיחות חדשות.

הסברים על המונחים

המונחים הבאים מופיעים בדף הזה:

לוחצים כדי לקרוא (TTR)
התכונה 'הקשה להקראה' מאפשרת לעוזרים דיגיטליים להקריא הודעות טקסט ולהשיב להן בשם המשתמש, כשהמשתמש מקיים אינטראקציה עם ההתראות על ההודעות.

תשובה ישירה
בדומה ל'לוחצים כדי לקרוא', רק שאסיסטנט קולי לא מקריא את ההודעה ומציג מיד הנחיה לתשובה.

שליחה ישירה
משתלב עם עוזר קולי כדי ליצור הודעה חדשה עם או בלי איש קשר ספציפי.

היתרונות של אפליקציות לא מקובצות

אפליקציות לא מקובצות, כמו Car Messenger, מספקות את היתרונות הבאים:

  • האפליקציה משתמשת רק בשיטות ציבוריות (אין תלות בפלטפורמה בממשקי API מוסתרים)
  • פיתוח אפליקציות מחוץ לפלטפורמת Android
  • הפעלה של גרסאות חדשות בתדירות גבוהה יותר (לפיצ'רים חדשים ולבעיות שתוקנו)
  • עדכון אפליקציות דרך Google Play

מידע נוסף על אפליקציות לא כלולות

פרטים טכניים

בקטע הזה מוסבר על הארכיטקטורה של Car Messenger. מידע נוסף זמין במאמר בנושא שילוב עם CarVoiceInteractionSession.

ארכיטקטורה מבוססת טלפוניה

כשמבצעים התאמה באמצעות Bluetooth, הנתונים מסונכרנים ממסד הנתונים של הטלפוניה בטלפון למסד הנתונים של הטלפוניה ברכב. אחרי ניתוק ה-Bluetooth, הנתונים המסונכרנים נמחקים ממסד הנתונים של הטלפוניה ברכב.

היכולת הזו נוספה ב-Android 12. היתרונות העיקריים כוללים:

  • אפשר לאחזר הודעות של משתמשים בכמות גדולה ממסד נתונים.
  • יש תמיכה בהודעות מנסיעות קודמות.
  • משתמש בארכיטקטורה וב-API דומים לאחסון ולשליפה של הודעות SMS בטלפונים עם Android.
  • הופך ללא תלוי בפלטפורמת Android.

כך מתבצע התהליך:

זרימת נתונים שמבוססת על טלפוניה איור 1. זרימת נתונים שמבוססת על טלפוניה.

התהליך מאויר בפורמט טקסט:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Car Messenger retrieves data from telephony database to display on UI.
                  |
                  --> 4. User interactions prompt the voice assistant.
                  |
          <-- 5. Car Messenger receives reply action from the voice assistant.
          |
    <-- 6. SMS is marked as read in car database.
    |
 7. Reply transmitted to recipients, phone database updated with reply and read status.

כך אנחנו משתמשים בנתונים:

השימוש בחבילת הגלישה ב-Car Messenger איור 2. טיפול בנתונים ב-Car Messenger.

התהליך מאויר בפורמט טקסט:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Phone disconnects from car.
                  |
                  --> 4. SMS data deleted from car telephony database.
  • בחיבור, הנתונים מועברים מהטלפון לרכב באמצעות Bluetooth MAP.
  • כשמנתקים את הטלפון, הנתונים שלו נמחקים ממסד הנתונים של הרכב.

התקנת Car Messenger

אפשר לקבל את הקומיט האחרון של Car Messenger מ-Google Git.

ממשקי API של אינטראקציות קוליות

אפליקציית Car Messenger משתמשת בממשקי CarVoiceInteractionSession API כדי להשתלב עם העוזר הדיגיטלי. האלמנטים האלה מתוארים בקטעים הבאים.

מודל PendingIntent

ממשקי ה-API האלה משתמשים ב-PendingIntent כדי להעביר שאילתות של Assistant שנפתרו בחזרה אל Car Messenger.

זהו רצף האירועים:

  1. אפליקציית Car Messenger מפעילה את Assistant על ידי התקשרות למספר activity.showAssist(Bundle args). הארגומנטים מכילים את פעולת ה-API והפרמטרים הנדרשים שלה, כולל intent בהמתנה אם צריך.

  2. ‫Assistant מאחזר את קלט המשתמש אם צריך, ומצרף אותו ל-pending intent.

  3. ‫Assistant שולח את הכוונה בחזרה ל-Car Messenger.

  4. ‫Car Messenger פותר את פעולת ה-API.

פעולת ה-API 'סימון כ'כבר קראתי''

כש-Assistant קוראת הודעה, הפעולה PendingIntent נשלחת ל-Car Messenger עם הפעולה VOICE_ACTION_READ_NOTIFICATION או VOICE_ACTION_READ_CONVERSATION כדי לסמן את ההודעה כהודעה שנקראה.

פעולה של Direct Reply API

כש-Assistant משיבה להודעה, PendingIntent נשלחת ל-Car Messenger עם הפעולה VOICE_ACTION_REPLY_NOTIFICATION ו-VOICE_ACTION_REPLY_CONVERSATION כדי להשיב לשיחה.

פעולת Direct Send SMS API

חבילה עם הפעולה VOICE_ACTION_SEND_SMS נשלחת מ-Car Messenger אל Assistant.

קוד לדוגמה:

/**
 *   KEY_PHONE_NUMBER - Recipients phone number. If this and the recipients name are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_NAME - Recipients name. If this and the recipient phone number are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_UID - Recipients UID in the ContactProvider database. Optionally provided
 *   by the application. Not required to be sent back by the assistant.
 *
 *   KEY_DEVICE_NAME - Friendly name of the device in which to send the message from. If not
 *   provided by the application, assistant must do device disambiguation but is not required
 *   to add it to PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_DEVICE_ADDRESS - Bluetooth device address of the device in which to send the message
 *   from. If not provided by the application, assistant must do device disambiguation and add
 *   this to the PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_SEND_PENDING_INTENT - @NotNull Will always be provided by the application. The
 *   application must preload the pending intent with any KEYs it provides the assistant that
 *   is also needed to send the message. (I.e if the application passes in the
 *   KEY_PHONE_NUMBER in the Bundle, the assistant can assume the application has already put
 *   this in the PendingIntent and may not re-add it to the PendingIntent).
 *
 */
public static final String KEY_PHONE_NUMBER = KEY_PHONE_NUMBER;
public static final String KEY_RECIPIENT_NAME = KEY_RECIPIENT_NAME;
public static final String KEY_RECIPIENT_UID = KEY_RECIPIENT_UID;
public static final String KEY_DEVICE_NAME = KEY_DEVICE_NAME;
public static final String KEY_DEVICE_ADDRESS = KEY_DEVICE_NAME;
public static final String KEY_SEND_PENDING_INTENT =KEY_SEND_PENDING_INTENT;

בתמונה הזו אפשר לראות איך כותבים הודעה כשנמען נבחר:

דף אנשי הקשר באפליקציית החייגן איור 3. דף אנשי הקשר באפליקציית החייגן.

בתמונה הזו מוצג תהליך כתיבת הודעה כשלא נבחר נמען באמצעות הודעה חדשה:

לא נבחר נמען איור 4. לחצן 'הודעה חדשה' באפליקציית Messenger.

שילוב של פעולת שליחת SMS ישירה

דוגמה לשילוב של החייגן עם VOICE_ACTION_SEND_SMS, עם פרמטרים אופציונליים:

    /**
     * Build the {@link Bundle} to pass to assistant to send a sms.
     */
    public Bundle buildDirectSendBundle(String number, String name, String uid,
                                        BluetoothDevice device) {
        Bundle bundle = new Bundle();
        bundle.putString(CarVoiceInteractionSession.KEY_ACTION, VOICE_ACTION_SEND_SMS);
        // start optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_PHONE_NUMBER, number);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_NAME, name);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_UID, uid);
        // end optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_ADDRESS, device.getAddress());
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_NAME,
                DialerUtils.getDeviceName(mContext, device));
        Intent intent = new Intent(mContext, MessagingService.class)
                .setAction(ACTION_DIRECT_SEND)
                .setClass(mContext, MessagingService.class);

        int requestCode = ACTION_DIRECT_SEND.hashCode();
        PendingIntent pendingIntent = PendingIntent.getForegroundService(
                mContext, requestCode, intent,
                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);

        bundle.putParcelable(KEY_SEND_PENDING_INTENT, pendingIntent);
        return bundle;
    }

שיפורים ב-TTR ובתשובה ישירה

ה-API המעודכן משתמש עכשיו במחלקה Conversation מגוונת, שמאפשרת פעולות מעבר לתחום ההתראות ומרחיבה את היכולות בהקשר של האפליקציה. השיטה הזו מחליפה את הדרישה הקודמת להשתמש במחלקה StatusBarNotification.

ניפוי באגים ב-Car Messenger

בקטעים הבאים מוסבר איך לנפות באגים ב-Car Messenger.

ניפוי באגים בחיבורי Bluetooth

  1. מריצים את הפקודה dumpsys:

    adb shell dumpsys bluetooth_manager
    • מחפשים את MapClientService בפלט פקודה dumpsys.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. מוודאים שהמכשיר הנכון מופיע ברשימה. לדוגמה:

    רשימת מכשירים איור 5. רשימת מכשירים.

  3. אם לא נמצא מכשיר, מבצעים אחת מהפעולות הבאות:

    • מתחברים מחדש ל-Bluetooth.

    או

    • בהגדרות ה-Bluetooth,מוודאים שהאפשרות הודעת טקסט מופעלת.

    או

    • בטלפון, מאשרים שניתנה גישה להודעות.

ניפוי באגים במסדי נתונים של Bluetooth

האפליקציה Car Messenger מבוססת על מסד הנתונים של הטלפוניה. כדי לבדוק אם נתוני ה-Bluetooth מאכלסים את מסד הנתונים הזה, אפשר להשתמש בפקודות שבטבלה.

משימה פקודה
שיחה adb shell content query --uri content://mms-sms/conversations?simple=true
הודעות SMS בלבד adb shell content query --uri content://sms
הודעות MMS/SMS adb shell content query --uri content://mms-sms/conversations
הודעות MMS בלבד adb shell content query --uri content://mms
תיבת דואר נכנס של MMS בלבד adb shell content query --uri content://mms/conversations/inbox
רק הודעות SMS שנשלחו adb shell content query --uri content://sms/sent
תיבת ה-SMS בלבד adb shell content query --uri content://sms/conversations/inbox
חלק 1 של הודעת MMS
(מחליפים את 1 במזהה של ה-MMS)
adb shell content query --uri content://mms/part/1

ניפוי באגים בשאילתות של Car Messenger והעוזר הקולי

הדפסה מתועדת כברירת מחדל אם קובץ האימג' בגרסת ה-build הוא eng או userdebug. אחרת, כדי להפעיל את הרישום ביומן של Car Messenger:

  1. מריצים את הפקודה לתגים הרלוונטיים adb shell setprop log.tag.<TAG> DEBUG.

  2. מפעילים את הרישום ביומן עבור טעינה מראש של Assistant.

  3. אם מדובר בבאגים שניתן לשחזר בקלות, כדאי להשתמש בנקודות עצירה (breakpoints) באמצעות Android Studio.