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 עם העוזרת, משתמשים בממשקי ה-API של CarVoiceInteractionSession. הרכיבים האלה מתוארים בקטעים הבאים.
מודל PendingIntent
ממשקי ה-API האלה משתמשים ב-PendingIntent
כדי להעביר בחזרה ל-Car Messenger את השאילתות של העוזרת הדיגיטלית שהותרו.
זהו רצף האירועים:
כדי להפעיל את Assistant ב-Car Messenger, שולחים את הפקודה
activity.showAssist(Bundle args)
. הארגים מכילים את פעולת ה-API ואת הפרמטרים הנדרשים שלה, כולל כוונה בהמתנה במקרה הצורך.אם צריך, Assistant מאחזרת את הקלט של המשתמש ומארזת אותו עם הכוונה בהמתנה.
Assistant שולחת את הכוונה חזרה אל Car Messenger.
Car Messenger פותר את פעולת ה-API.
פעולת API לסימון כפריט שנקרא
כש-Assistant קוראת הודעה, האות PendingIntent
נשלח ל-Car Messenger עם הפעולה VOICE_ACTION_READ_NOTIFICATION
או VOICE_ACTION_READ_CONVERSATION
כדי לסמן את ההודעה כנקראה.
פעולת API של תשובה ישירה
כש-Assistant משיבה להודעה, PendingIntent
נשלח ל-Car Messenger עם הפעולה VOICE_ACTION_REPLY_NOTIFICATION
ו-VOICE_ACTION_REPLY_CONVERSATION
כדי לענות לשיחה.
פעולת API לשליחת SMS ישירה
חבילה עם הפעולה 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
ב-Dialer, עם פרמטרים אופציונליים:
/**
* 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;
}
שיפורים במדד זמן הצגת המודעות ובאפשרות 'תשובה ישירה'
ב-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 |
הודעת ה-MMS, חלק 1 (מחליפים את 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 שהוטענה מראש.
אם מדובר באגים שאפשר לשחזר בקלות, מומלץ להשתמש בנקודות עצירה ב-Android Studio.