אפליקציית Car Messenger מציעה יכולות שליחת הודעות שמיועדות למכשירים לרכב. כמו באפליקציות אחרות לרכב, המשתמשים מפעילים את Car Messenger ממרכז האפליקציות.
מה חדש ב-Car Messenger?
באמצעות אפליקציית Car Messenger החדשה, נהגים יכולים:
- ליהנות מחוויה ייעודית של העברת הודעות.
- מפעילים את Car Messenger ממרכז האפליקציות.
- עיון בהודעות שהתקבלו לפני הנסיעה ובמהלכה.
- להאזין להודעות ולענות להן.
- להשתיק את ההתראות על הודעות.
- מתחילים שיחות חדשות.
טרמינולוגיה
המונחים הבאים מופיעים בדף הזה:
היתרונות של אפליקציות לא מקובצות
אפליקציות לא מקובצות, כמו 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.
כך אנחנו משתמשים בנתונים:
איור 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
כדי להעביר שאילתות של העוזר הדיגיטלי בחזרה אל Car Messenger.
זהו רצף האירועים:
האפליקציה Car Messenger מפעילה את Assistant על ידי התקשרות למספר
activity.showAssist(Bundle args)
. הארגומנטים מכילים את פעולת ה-API והפרמטרים הנדרשים שלה, כולל intent בהמתנה אם צריך.Assistant מאחזר את קלט המשתמש אם צריך, ומצרף אותו ל-pending intent.
Assistant שולח את הכוונה בחזרה ל-Car Messenger.
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 - Recipient’s 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 - Recipient’s 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 - Recipient’s 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
מריצים את הפקודה
dumpsys
:adb shell dumpsys bluetooth_manager
- מחפשים את
MapClientService
בפלט של הפקודה dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- מחפשים את
מוודאים שהמכשיר הנכון מופיע ברשימה. לדוגמה:
איור 5. רשימת מכשירים.
אם לא נמצא מכשיר, מבצעים אחת מהפעולות הבאות:
- מתחברים מחדש ל-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:
מריצים את התגים הרלוונטיים
adb shell setprop log.tag.<TAG> DEBUG
.מפעילים את הרישום ביומן עבור Preloaded Assistant.
אם מדובר בבאגים שניתן לשחזר בקלות, כדאי להשתמש בנקודות עצירה (breakpoints) ב-Android Studio.