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 כדי להעביר שאילתות של Assistant שנפתרו בחזרה אל 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.מפעילים את הרישום ביומן עבור טעינה מראש של Assistant.
אם מדובר בבאגים שניתן לשחזר בקלות, כדאי להשתמש בנקודות עצירה (breakpoints) באמצעות Android Studio.