वॉइस असिस्टेंट की 'टैप करके सुनें' सुविधा

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 में ये तीन पैरामीटर होते हैं:
  • args
  • showFlags
  • actions
onShow में ये दो पैरामीटर इस्तेमाल किए जाते हैं:
  • args
  • showFlags

Android 10 में हुए बदलाव

Android 10 से, प्लैटफ़ॉर्म VoiceInteractionService.onGetSupportedVoiceActions को कॉल करता है, ताकि यह पता लगाया जा सके कि कौनसी कार्रवाइयां की जा सकती हैं. वॉइस असिस्टेंट, VoiceInteractionService.onGetSupportedVoiceActions को बदलकर लागू करती है, जैसा कि इस उदाहरण में दिखाया गया है:

public class MyInteractionService extends VoiceInteractionService {
    private static final List SUPPORTED_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_READ_NOTIFICATION के लिए सीक्वेंस डायग्राम.

तीसरे चित्र के मामले में, हमारा सुझाव है कि ऐप्लिकेशन में अनुमति के अनुरोधों की दर से जुड़ी सीमाएं लागू की जाएं:

VOICE_ACTION_REPLY_NOTIFICATION

तीसरी इमेज. VOICE_ACTION_REPLY_NOTIFICATION के लिए सीक्वेंस डायग्राम.

VOICE_ACTION_HANDLE_EXCEPTION

चौथी इमेज. 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;
}