Car Messenger, मैसेज भेजने की ऐसी सुविधाएं उपलब्ध कराता है जो खास तौर पर कार में लगे डिवाइसों के लिए डिज़ाइन की गई हैं. कार से जुड़े अन्य ऐप्लिकेशन की तरह, उपयोगकर्ता Car Messenger को लॉन्चर से शुरू करते हैं.
Car Messenger में नया क्या है?
Car Messenger ऐप्लिकेशन की मदद से ड्राइवर:
- मैसेजिंग की सुविधा का बेहतर अनुभव पाएं.
- लॉन्चर से Car Messenger लॉन्च करें.
- ड्राइव से पहले और ड्राइव के दौरान मिले मैसेज ब्राउज़ करें.
- मैसेज सुनना और उनका जवाब देना.
- मैसेज की सूचनाएं म्यूट करना.
- नई बातचीत शुरू करें.
शब्दावली
इस पेज पर इन शब्दों का इस्तेमाल किया गया है:
अनबंडल किए गए ऐप्लिकेशन के फ़ायदे
अलग से उपलब्ध कराए गए ऐप्लिकेशन, जैसे कि Car Messenger, ये फ़ायदे देते हैं:
- सिर्फ़ सार्वजनिक तरीकों का इस्तेमाल करता है (छुपे हुए एपीआई पर कोई प्लैटफ़ॉर्म निर्भरता नहीं है)
- Android प्लैटफ़ॉर्म के बाहर ऐप्लिकेशन डेवलप करना
- नई सुविधाओं और ठीक की गई समस्याओं के लिए, ज़्यादा बार रिलीज़ चालू करें
- Google Play के ज़रिए ऐप्लिकेशन अपडेट करना
अनबंडल किए गए ऐप्लिकेशन के बारे में ज़्यादा जानें.
तकनीकी जानकारी
इस सेक्शन में, Car Messenger के आर्किटेक्चर के बारे में बताया गया है. ज़्यादा जानने के लिए, CarVoiceInteractionSession के साथ इंटिग्रेट करना लेख पढ़ें.
टेलीफ़ोनी पर आधारित आर्किटेक्चर
ब्लूटूथ से कनेक्ट होने पर, फ़ोन के टेलीफ़ोनी डेटाबेस से कार के टेलीफ़ोनी डेटाबेस में डेटा सिंक किया जाता है. ब्लूटूथ डिसकनेक्ट होने पर, सिंक किया गया डेटा कार के टेलीफ़ोनी डेटाबेस से मिट जाता है.
यह सुविधा Android 12 में जोड़ी गई थी. इसके मुख्य फ़ायदे ये हैं:
- उपयोगकर्ताओं के कई मैसेज, डेटाबेस से वापस लाए जा सकते हैं.
- पिछली ड्राइव के मैसेज देखने की सुविधा उपलब्ध है.
- Android फ़ोन पर एसएमएस को सेव करने और वापस पाने के लिए, एक जैसे आर्किटेक्चर और एपीआई का इस्तेमाल करता है.
- Android प्लैटफ़ॉर्म से पूरी तरह से अलग हो जाता है.
यहां इसका फ़्लो दिया गया है:
पहली इमेज. टेलीफ़ोनी पर आधारित डेटा फ़्लो.
टेक्स्ट फ़ॉर्मैट में बताया गया फ़्लो:
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 के डेटा को मैनेज करना.
टेक्स्ट फ़ॉर्मैट में बताया गया फ़्लो:
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.
- कनेक्ट होने पर, ब्लूटूथ मैप का इस्तेमाल करके फ़ोन से कार में डेटा ट्रांसफ़र किया जाता है.
- फ़ोन को डिसकनेक्ट करने पर, उस फ़ोन का डेटा कार के डेटाबेस से मिट जाता है.
Car Messenger ऐक्सेस करना
Google Git से, Car Messenger का नया वर्शन डाउनलोड करें.
वॉइस इंटरैक्शन एपीआई
Car Messenger, Assistant के साथ इंटिग्रेट करने के लिए, CarVoiceInteractionSession एपीआई का इस्तेमाल करता है. इन एलिमेंट के बारे में, यहां दिए गए सेक्शन में बताया गया है.
PendingIntent मॉडल
ये एपीआई, हल की गई Assistant की क्वेरी को Car Messenger पर वापस भेजने के लिए PendingIntent
का इस्तेमाल करते हैं.
इवेंट का क्रम इस तरह है:
Car Messenger,
activity.showAssist(Bundle args)
को कॉल करके Assistant को लॉन्च करता है. args में एपीआई ऐक्शन और उसके ज़रूरी पैरामीटर शामिल होते हैं. अगर ज़रूरी हो, तो इसमें लंबित इंटेंट भी शामिल होता है.ज़रूरत पड़ने पर, Assistant उपयोगकर्ता के इनपुट को वापस लाती है और उसे पूरे नहीं हुए इंटेंट के साथ पैकेज करती है.
Assistant, इंटेंट को Car Messenger पर वापस भेजती है.
Car Messenger, एपीआई की कार्रवाई को हल करता है.
'पढ़ा गया' के तौर पर मार्क करने वाली एपीआई कार्रवाई
जब 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 ऐक्शन
कार मैसेंजर, Assistant को VOICE_ACTION_SEND_SMS
ऐक्शन वाला बंडल भेजता है.
सैंपल कोड:
/**
* 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”;
इस इमेज में, मैसेज पाने वाले व्यक्ति को चुनने के बाद मैसेज लिखने की सुविधा दिखाई गई है:
तीसरी इमेज. डायल करने वाले ऐप्लिकेशन में मौजूद संपर्क पेज.
इस इमेज में, नया मैसेज का इस्तेमाल करके, मैसेज लिखने की सुविधा दिखाई गई है. इसमें कोई भी ईमेल पाने वाला नहीं चुना गया है:
चौथी इमेज. Messenger ऐप्लिकेशन में मौजूद, नया मैसेज बटन.
एसएमएस सीधे भेजने की सुविधा को इंटिग्रेट करना
यहां Dialer में 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;
}
टेक्स्ट पढ़ने में लगने वाले समय (टीटीआर) और सीधे नोटिफ़िकेशन से ही जवाब देने की सुविधा में सुधार
अपडेट किए गए एपीआई में अब Conversation
क्लास का इस्तेमाल किया जाता है. इससे सूचनाओं के दायरे से बाहर भी कार्रवाइयां की जा सकती हैं. साथ ही, ऐप्लिकेशन के कॉन्टेक्स्ट में सुविधाओं को बढ़ाया जा सकता है. यह StatusBarNotification
क्लास का इस्तेमाल करने की पिछली ज़रूरी शर्त की जगह लेता है.
कार में मौजूद Messenger को डीबग करना
Car Messenger को डीबग करने के बारे में ज़्यादा जानने के लिए, यहां दिए गए सेक्शन देखें.
ब्लूटूथ कनेक्शन डीबग करना
dumpsys
कमांड चलाएं:adb shell dumpsys bluetooth_manager
- dumpsys कमांड के आउटपुट में
MapClientService
खोजें.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- dumpsys कमांड के आउटपुट में
पुष्टि करें कि सूची में सही डिवाइस दिख रहा हो. उदाहरण के लिए:
पांचवीं इमेज. डिवाइसों की सूची.
अगर कोई डिवाइस नहीं मिलता है, तो इनमें से कोई एक तरीका अपनाएं:
- ब्लूटूथ से फिर से कनेक्ट करें.
या
- ब्लूटूथ सेटिंग में जाकर,पुष्टि करें कि टेक्स्ट मैसेज की सुविधा चालू हो.
या
- फ़ोन पर, पुष्टि करें कि मैसेज ऐक्सेस करने की अनुमति दी गई हो.
ब्लूटूथ डेटाबेस डीबग करना
Car Messenger, टेलीफ़ोनी डेटाबेस पर बनाया गया है. यह पता लगाने के लिए कि ब्लूटूथ उस डेटाबेस को भर रहा है या नहीं, टेबल में दिए गए निर्देशों का इस्तेमाल किया जा सकता है.
टास्क | निर्देश |
---|---|
बातचीत | adb shell content query --uri content://mms-sms/conversations?simple=true |
सिर्फ़ मैसेज (एसएमएस) | adb shell content query --uri content://sms |
मल्टीमीडिया मैसेज (एमएमएस)/मैसेज (एसएमएस) | adb shell content query --uri content://mms-sms/conversations |
सिर्फ़ मल्टीमीडिया मैसेज (एमएमएस) | adb shell content query --uri content://mms |
सिर्फ़ मल्टीमीडिया मैसेज (एमएमएस) इनबॉक्स | adb shell content query --uri content://mms/conversations/inbox |
सिर्फ़ भेजे गए मैसेज (एसएमएस) | adb shell content query --uri content://sms/sent |
सिर्फ़ एसएमएस इनबॉक्स | adb shell content query --uri content://sms/conversations/inbox |
मल्टीमीडिया मैसेज (एमएमएस) का पहला हिस्सा ( 1 को मल्टीमीडिया मैसेज (एमएमएस) के आईडी से बदलें) |
adb shell content query --uri content://mms/part/1 |
Car Messenger और वॉइस असिस्टेंट की क्वेरी को डीबग करना
अगर बिल्ड इमेज eng
या userdebug
है, तो डिफ़ॉल्ट रूप से प्रिंट लॉग करता है.
इसके अलावा, Car Messenger के लिए लॉगिंग की सुविधा चालू करने के लिए:
काम के टैग के लिए,
adb shell setprop log.tag.<TAG> DEBUG
चलाएं.प्रीलोड की गई Assistant के लिए लॉगिंग चालू करें.
बार-बार होने वाली गड़बड़ियों के लिए, Android Studio के साथ ब्रेकपॉइंट का इस्तेमाल करें.