वॉयस असिस्टेंट टैप-टू-रीड

एंड्रॉइड ऑटोमोटिव आवाज को ड्राइव-सुरक्षित इंटरैक्शन के लिए एक महत्वपूर्ण घटक मानता है और उपयोगकर्ताओं के लिए ड्राइविंग के दौरान एंड्रॉइड ऑटोमोटिव ओएस के साथ बातचीत करने के सबसे सुरक्षित तरीकों में से एक है। परिणामस्वरूप, हमने एंड्रॉइड वॉयस असिस्टेंट एपीआई ( VoiceInteractionSession सहित) का विस्तार किया ताकि वॉयस असिस्टेंट उपयोगकर्ताओं के लिए ऐसे कार्य कर सकें जिन्हें ड्राइविंग करते समय पूरा करना मुश्किल हो सकता है।

जब उपयोगकर्ता संदेश सूचनाओं के साथ इंटरैक्ट करता है, तो टैप-टू-रीड वॉयस असिस्टेंट को उपयोगकर्ता की ओर से टेक्स्ट संदेशों को पढ़ने और जवाब देने में सक्षम बनाता है। इस कार्यक्षमता को प्रदान करने के लिए, आप एक वॉयस असिस्टेंट को CarVoiceInteractionSession के साथ एकीकृत कर सकते हैं।

ऑटोमोटिव में, INBOX या INBOX_IN_GROUP (उदाहरण के लिए, एसएमएस संदेश) के रूप में पहचाने जाने वाले अधिसूचना केंद्र पर पोस्ट की गई सूचनाओं में एक प्ले बटन शामिल होता है। उपयोगकर्ता चयनित वॉयस असिस्टेंट को अधिसूचना को जोर से पढ़ने और वैकल्पिक रूप से आवाज से उत्तर देने के लिए प्ले पर क्लिक कर सकता है।

टैप-टू-रीड अधिसूचना

चित्र 1. प्ले बटन के साथ टैप-टू-रीड अधिसूचना।

CarVoiceInteractionSession के साथ एकीकृत करें

अगले अनुभाग वर्णन करते हैं कि वॉयस असिस्टेंट को CarVoiceInteractionSession के साथ कैसे एकीकृत किया जाए।

ध्वनि इंटरैक्शन का समर्थन करें

कार वॉयस इंटरेक्शन सेवाएं प्रदान करने वाले ऐप्स को मौजूदा एंड्रॉइड वॉयस इंटरैक्शन के साथ एकीकृत होना चाहिए । अधिक जानने के लिए, Android के लिए Google Assistant देखें ( VoiceInteractionSession के अपवाद के साथ)। जबकि सभी वॉयस इंटरेक्शन एपीआई तत्व मोबाइल उपकरणों पर लागू किए गए समान ही रहते हैं, CarVoiceInteractionSession ( कार्यान्वयन CarVoiceInteractionSession में वर्णित) VoiceInteractionSession जगह लेता है। अधिक जानकारी के लिए ये पेज देखें:

CarVoiceInteractionSession लागू करें

CarVoiceInteractionSession एपीआई को उजागर करता है जिसका उपयोग आप ध्वनि सहायकों को पाठ संदेशों को जोर से पढ़ने और फिर उपयोगकर्ता की ओर से उन संदेशों का उत्तर देने में सक्षम करने के लिए कर सकते हैं।

CarVoiceInteractionSession और VoiceInteractionSession कक्षाओं के बीच मुख्य अंतर यह है कि CarVoiceInteractionSession onShow में कार्रवाई में गुजरता है, इसलिए जैसे ही CarVoiceInteractionSession एक सत्र शुरू करता है, ध्वनि सहायक उपयोगकर्ता के अनुरोध के संदर्भ का पता लगा सकता है। प्रत्येक वर्ग के लिए onShow के पैरामीटर निम्न तालिका में सूचीबद्ध हैं:

कारवॉइसइंटरेक्शनसेशन वॉयसइंटरेक्शनसेशन
onShow ये तीन पैरामीटर लेता है:
  • args
  • showFlags
  • actions
onShow ये दो पैरामीटर लेता है:
  • args
  • showFlags

एंड्रॉइड 10 में बदलाव

एंड्रॉइड 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 BIND_NOTIFICATION_LISTENER_SERVICE अनुमति नहीं है और उपयोगकर्ता से यह अनुमति प्राप्त करना है।

अधिसूचना श्रोता की अनुमति का अनुरोध करें

यदि डिफ़ॉल्ट वॉयस असिस्टेंट के पास अधिसूचना श्रोता की अनुमति नहीं है, तो प्लेटफ़ॉर्म का FallbackAssistant (यदि कार निर्माता द्वारा सक्षम किया गया है) अनुमति का अनुरोध करने के लिए वॉयस असिस्टेंट को सूचित करने से पहले संदेश को ज़ोर से पढ़ सकता है। यह निर्धारित करने के लिए कि क्या FallbackAssistant सक्षम है और उसने संदेश पढ़ा है, वॉयस असिस्टेंट को पेलोड में KEY_FALLBACK_ASSISTANT_ENABLED बूलियन मान की जांच करनी चाहिए।

प्लेटफ़ॉर्म अनुशंसा करता है कि जितनी बार इस अनुमति का अनुरोध किया जाए उतनी बार वॉयस असिस्टेंट दर-सीमित तर्क जोड़ें। ऐसा करने से उस उपयोगकर्ता का सम्मान होता है जो वॉयस असिस्टेंट को यह अनुमति नहीं देना चाहता है और पाठ संदेशों को जोर से पढ़ने के लिए FallbackAssistant प्राथमिकता देता है। जब भी उपयोगकर्ता किसी संदेश अधिसूचना पर प्ले दबाता है तो उसे अनुमति के लिए संकेत देना एक नकारात्मक उपयोगकर्ता अनुभव हो सकता है। प्लेटफ़ॉर्म वॉयस असिस्टेंट की ओर से दर सीमा नहीं लगाता है।

अधिसूचना श्रोता की अनुमति का अनुरोध करते समय, ध्वनि सहायक को यह निर्धारित करने के लिए CarUxRestrictionsManager का उपयोग करना चाहिए कि कोई उपयोगकर्ता पार्क कर रहा है या गाड़ी चला रहा है। यदि उपयोगकर्ता गाड़ी चला रहा है, तो वॉयस असिस्टेंट एक अधिसूचना प्रदर्शित करता है जो अनुमति देने के तरीके के बारे में निर्देश प्रदान करता है। ऐसा करने से उपयोगकर्ता को सुरक्षित होने पर अनुमति देने में मदद मिलती है (और याद आती है)।

स्टेटसबारनोटिफिकेशन के साथ काम करें

पढ़ने और उत्तर देने वाली आवाज क्रियाओं के साथ पारित StatusBarNotification हमेशा एक कार-संगत मैसेजिंग अधिसूचना में होता है जैसा कि संदेशों के उपयोगकर्ताओं को सूचित करें में वर्णित है। हालाँकि कुछ सूचनाओं में उत्तर लंबित आशय नहीं हो सकता है, लेकिन उन सभी में 'पढ़ें' के रूप में चिह्नित करें लंबित आशय है।

सूचनाओं के साथ इंटरैक्शन को सुव्यवस्थित करने के लिए, NotificationPayloadHandler का उपयोग करें, जो अधिसूचना से संदेशों को निकालने और अधिसूचना के उचित लंबित इरादे पर उत्तर संदेश लिखने के तरीके प्रदान करता है। वॉइस असिस्टेंट द्वारा संदेश को पढ़ने के बाद, वॉइस असिस्टेंट को मार्क एज़ रीड इंटेंट को फायर करना होगा

टैप-टू-रीड पूर्व शर्ते संतुष्ट करें

जब कोई उपयोगकर्ता संदेशों को पढ़ने और उत्तर देने के लिए ध्वनि क्रिया को ट्रिगर करता है तो डिफ़ॉल्ट वॉयस असिस्टेंट का केवल VoiceInteractionSession अधिसूचित किया जाता है। जैसा कि ऊपर बताया गया है, इस डिफ़ॉल्ट वॉयस असिस्टेंट के पास अधिसूचना श्रोता की अनुमति भी होनी चाहिए।

अनुक्रम आरेख

ये आंकड़े CarVoiceInteractionSession actions के तर्क प्रवाह को प्रदर्शित करते हैं:

VOICE_ACTION_READ_NOTIFICATION

चित्र 2. VOICE_ACTION_READ_NOTIFICATION के लिए अनुक्रम आरेख।

चित्र 3 के मामले में, अनुमति अनुरोधों पर दर सीमा के ऐप की अनुशंसा की जाती है:

VOICE_ACTION_REPLY_नोटिफिकेशन

चित्र 3. VOICE_ACTION_REPLY_NOTIFICATION के लिए अनुक्रम आरेख।

VOICE_ACTION_HANDLE_EXCEPTION

चित्र 4. 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;
}