Android Automotive, गाड़ी चलाते समय सुरक्षित तरीके से इंटरैक्ट करने के लिए, आवाज़ को एक अहम कॉम्पोनेंट मानता है. साथ ही, यह उपयोगकर्ताओं के लिए गाड़ी चलाते समय, Android Automotive OS के साथ इंटरैक्ट करने का सबसे सुरक्षित तरीका भी है. इसलिए, हमने Android की वॉइस असिस्टेंट के एपीआई (VoiceInteractionSession
को भी शामिल किया है) को बड़ा किया है, ताकि वॉइस असिस्टेंट, उपयोगकर्ताओं के लिए ऐसे टास्क पूरे कर सकें जो गाड़ी चलाते समय पूरे करना मुश्किल हो सकता है.
टैप करके सुनें सुविधा की मदद से, वॉइस असिस्टेंट, उपयोगकर्ता की ओर से मैसेज पढ़कर सुन सकती हैं और उनका जवाब दे सकती हैं. ऐसा तब होता है, जब उपयोगकर्ता मैसेज की सूचनाओं के साथ इंटरैक्ट करता है. यह सुविधा देने के लिए, CarVoiceInteractionSession
के साथ वॉइस असिस्टेंट को इंटिग्रेट किया जा सकता है.
Automotive में, सूचना केंद्र में पोस्ट की गई सूचनाओं में INBOX
या INBOX_IN_GROUP
(उदाहरण के लिए, एसएमएस मैसेज) के तौर पर पहचान की गई सूचनाओं में, चलाएं बटन शामिल होता है. उपयोगकर्ता, चलाएं पर क्लिक करके, चुनी गई वॉइस असिस्टेंट को सूचना पढ़कर सुनाने के लिए कह सकता है. साथ ही, बोलकर जवाब देने का विकल्प भी चुना जा सकता है.
पहली इमेज. 'चलाएं' बटन के साथ, सूचना को पढ़कर सुनाने की सुविधा.
CarVoiceInteractionSession के साथ इंटिग्रेट करना
अगले सेक्शन में, CarVoiceInteractionSession
के साथ वॉइस असिस्टेंट को इंटिग्रेट करने का तरीका बताया गया है.
वॉइस इंटरैक्शन की सुविधा काम करती हो
कार में आवाज़ से इंटरैक्ट करने की सुविधा देने वाले ऐप्लिकेशन को, Android की मौजूदा आवाज़ से इंटरैक्ट करने की सुविधाओं के साथ इंटिग्रेट करना ज़रूरी है. ज़्यादा जानने के लिए, Android के लिए Google Assistant देखें. हालांकि, वॉइस इंटरैक्शन एपीआई के सभी एलिमेंट, मोबाइल डिवाइसों पर लागू किए गए एलिमेंट जैसे ही रहते हैं, लेकिन CarVoiceInteractionSession
(कार में वॉइस इंटरैक्शन सेशन लागू करना में बताया गया है) VoiceInteractionSession
की जगह ले लेता है.VoiceInteractionSession
ज़्यादा जानकारी के लिए, ये पेज देखें:
CarVoiceInteractionSession लागू करना
CarVoiceInteractionSession
ऐसे एपीआई उपलब्ध कराता है जिनका इस्तेमाल करके, वॉइस असिस्टेंट को टेक्स्ट मैसेज तेज़ आवाज़ में पढ़ने और फिर उपयोगकर्ता की ओर से उन मैसेज का जवाब देने के लिए चालू किया जा सकता है.
CarVoiceInteractionSession
और
VoiceInteractionSession
क्लास के बीच का मुख्य अंतर यह है कि
CarVoiceInteractionSession
, onShow
में कार्रवाई को पास करता है
ताकि वॉइस असिस्टेंट, CarVoiceInteractionSession
सेशन शुरू होने के तुरंत बाद, उपयोगकर्ता के अनुरोध के संदर्भ का पता लगा सके. हर क्लास के लिए onShow
के पैरामीटर, नीचे दी गई टेबल में दिए गए हैं:
CarVoiceInteractionSession | VoiceInteractionSession |
---|---|
onShow में ये तीन पैरामीटर होते हैं:
|
onShow में ये दो पैरामीटर इस्तेमाल किए जाते हैं:
|
Android 10 में हुए बदलाव
Android 10 से, प्लैटफ़ॉर्म VoiceInteractionService.onGetSupportedVoiceActions
को कॉल करता है, ताकि यह पता लगाया जा सके कि कौनसी कार्रवाइयां की जा सकती हैं. वॉइस असिस्टेंट, VoiceInteractionService.onGetSupportedVoiceActions
को बदलकर लागू करती है, जैसा कि इस उदाहरण में दिखाया गया है:
public class MyInteractionService extends VoiceInteractionService { private static final ListSUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION); @Override public Set onGetSupportedVoiceActions(@NonNull Set voiceActions) { Set result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } }
मान्य कार्रवाइयों के बारे में नीचे दी गई टेबल में बताया गया है. हर कार्रवाई के बारे में जानकारी पाने के लिए, सीक्वेंस डायग्राम देखें.
कार्रवाई | अनुमानित पेलोड | बोलकर निर्देश देने की सुविधा से होने वाली कार्रवाई |
---|---|---|
VOICE_ACTION_READ_NOTIFICATION |
उपयोगकर्ता को मैसेज ज़ोर से पढ़कर सुनाएं. इसके बाद, मैसेज पढ़े जाने के बाद, 'पढ़ा गया' के तौर पर मार्क करने के लिए, इंटेंट को फिर से ट्रिगर करें. इसके अलावा, उपयोगकर्ता से जवाब देने के लिए कहा जा सकता है. | |
VOICE_ACTION_REPLY_NOTIFICATION |
कुंजी के साथ पार्सल किया जा सकता है.KEY_NOTIFICATION
जो StatusBarNotification पर मैप करता है.android.permission.BIND_NOTIFICATION_LISTENER_SERVICE की ज़रूरत है. |
उपयोगकर्ता से जवाब देने के लिए कहें. इसके बाद, जवाब को RemoteInputReply में डालें और फिर टास्क को शुरू करें. |
VOICE_ACTION_HANDLE_EXCEPTION |
कुंजी वाली स्ट्रिंग.KEY_EXCEPTION
जो ExceptionValue पर मैप करता है (अपवाद वाली वैल्यू में बताया गया है).KEY_FALLBACK_ASSISTANT_ENABLED , जो बूलियन वैल्यू पर मैप करता है. अगर वैल्यू true है, तो उपयोगकर्ता के अनुरोध को मैनेज करने वाली फ़ॉलबैक असिस्टेंट को बंद कर दिया गया है. |
अपवाद के लिए की जाने वाली कार्रवाई के बारे में, अपवाद के दस्तावेज़ में बताया गया है. |
अपवाद की वैल्यू
EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
, वॉइस असिस्टेंट को बताता है कि उसके पास Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
अनुमति नहीं है और उसे उपयोगकर्ता से यह अनुमति लेनी होगी.
सूचना सुनने वाले ऐप्लिकेशन को अनुमति देने का अनुरोध करना
अगर डिफ़ॉल्ट वॉइस असिस्टेंट के पास सूचना सुनने की अनुमति नहीं है, तो हो सकता है कि कार बनाने वाली कंपनी ने प्लैटफ़ॉर्म के FallbackAssistant
को अनुमति देने की सुविधा चालू की हो. ऐसे में, वॉइस असिस्टेंट को अनुमति का अनुरोध करने से पहले, प्लैटफ़ॉर्म का FallbackAssistant
मैसेज को तेज़ आवाज़ में पढ़ सकता है. यह पता लगाने के लिए कि FallbackAssistant
चालू है या नहीं और उसने मैसेज पढ़ा है या नहीं, वॉइस असिस्टेंट को पेलोड में KEY_FALLBACK_ASSISTANT_ENABLED
बूलियन वैल्यू की जांच करनी चाहिए.
प्लैटफ़ॉर्म का सुझाव है कि वॉइस असिस्टेंट, इस अनुमति के लिए अनुरोध किए जाने की संख्या के हिसाब से, दर को सीमित करने वाला लॉजिक जोड़ें. ऐसा करने से, उन उपयोगकर्ताओं की ज़रूरतों का ध्यान रखा जाता है जो बोलकर मैसेज पढ़ने की सुविधा का इस्तेमाल करना चाहते हैं, लेकिन वे वॉइस असिस्टेंट को यह अनुमति नहीं देना चाहते.FallbackAssistant
जब भी उपयोगकर्ता किसी मैसेज की सूचना पर चलाएं बटन दबाता है, तो उससे अनुमति मांगने पर उपयोगकर्ता के अनुभव पर बुरा असर पड़ सकता है. प्लैटफ़ॉर्म, वॉइस असिस्टेंट की ओर से किराये की सीमाएं नहीं तय करता.
सूचना सुनने की अनुमति का अनुरोध करते समय, वॉइस असिस्टेंट को CarUxRestrictionsManager
का इस्तेमाल करके यह पता लगाना चाहिए कि उपयोगकर्ता कार पार्क कर रहा है या चला रहा है. अगर उपयोगकर्ता गाड़ी चला रहा है, तो वॉइस असिस्टेंट एक सूचना दिखाती है. इसमें अनुमति देने का तरीका बताया जाता है. ऐसा करने से, उपयोगकर्ता को सुरक्षित होने पर अनुमति देने में मदद मिलती है. साथ ही, उसे अनुमति देने की याद दिलाई जाती है.
StatusBarNotification का इस्तेमाल करना
मैसेज के बारे में उपयोगकर्ताओं को सूचना दें में बताए गए तरीके के मुताबिक, StatusBarNotification
को पढ़ने और जवाब देने की वॉइस ऐक्शन के साथ पास किया गया, जो हमेशा कार के साथ काम करने वाली मैसेजिंग सूचना में होता है. ऐसा हो सकता है कि कुछ सूचनाओं में 'जवाब देना बाकी है' वाला इंटेंट न हो, लेकिन उन सभी में 'पढ़ा गया के तौर पर मार्क करें' वाला इंटेंट होता है.
सूचनाओं के साथ इंटरैक्शन को आसान बनाने के लिए, NotificationPayloadHandler
का इस्तेमाल करें. इससे, सूचना से मैसेज निकालने और सूचना के लिए, जवाब वाले मैसेज लिखने के तरीके मिलते हैं. जब वॉइस असिस्टेंट मैसेज पढ़कर सुनाए, तो उसे 'पढ़ा गया' के तौर पर मार्क करने का इंटेंट भेजना चाहिए.
'टैप करके पढ़ें' सुविधा की ज़रूरी शर्तें पूरी करना
जब कोई उपयोगकर्ता मैसेज पढ़ने और उनका जवाब देने के लिए वॉइस ऐक्शन को ट्रिगर करता है, तो डिफ़ॉल्ट वॉइस असिस्टेंट के सिर्फ़ VoiceInteractionSession
को सूचना दी जाती है. जैसा कि ऊपर बताया गया है, इस डिफ़ॉल्ट वॉइस असिस्टेंट के पास, सूचना सुनने की अनुमति भी होनी चाहिए.
सीक्वेंस डायग्राम
इन इमेज में, CarVoiceInteractionSession actions
के लॉजिक फ़्लो दिखाए गए हैं:
दूसरी इमेज. VOICE_ACTION_READ_NOTIFICATION के लिए सीक्वेंस डायग्राम.
तीसरे चित्र के मामले में, हमारा सुझाव है कि ऐप्लिकेशन में अनुमति के अनुरोधों की दर से जुड़ी सीमाएं लागू की जाएं:
तीसरी इमेज. VOICE_ACTION_REPLY_NOTIFICATION के लिए सीक्वेंस डायग्राम.
चौथी इमेज. VOICE_ACTION_HANDLE_EXCEPTION के लिए सीक्वेंस डायग्राम.
ऐप्लिकेशन का नाम पढ़ना
अगर आपको अपनी वॉइस असिस्टेंट से मैसेज पढ़कर सुनाने के दौरान, मैसेजिंग ऐप्लिकेशन का नाम भी पढ़कर सुनाने का विकल्प चाहिए, तो नीचे दिए गए कोड के उदाहरण जैसा फ़ंक्शन बनाएं. इससे यह पक्का किया जा सकेगा कि असिस्टेंट सही नाम पढ़कर सुनाएगी:
@Nullable String getMessageApplicationName(Context context, StatusBarNotification statusBarNotification) { ApplicationInfo info = getApplicationInfo(context, statusBarNotification.getPackageName()); if (info == null) return null; Notification notification = statusBarNotification.getNotification(); // Sometimes system packages will post on behalf of other apps, so check this // field for a system app notification. if (isSystemApp(info) && notification.extras.containsKey(Notification.EXTRA_SUBSTITUTE_APP_NAME)) { return notification.extras.getString(Notification.EXTRA_SUBSTITUTE_APP_NAME); } else { PackageManager pm = context.getPackageManager(); return String.valueOf(pm.getApplicationLabel(info)); } } @Nullable ApplicationInfo getApplicationInfo(Context context, String packageName) { final PackageManager pm = context.getPackageManager(); ApplicationInfo info; try { info = pm.getApplicationInfo(packageName, 0); } catch (PackageManager.NameNotFoundException e) { return null; } return info; } boolean isSystemApp(ApplicationInfo info) { return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; }