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

Android Automotive, आवाज़ को इन कामों के लिए एक अहम कॉम्पोनेंट के तौर पर ड्राइव-सुरक्षित इंटरैक्शन और लोगों के लिए, यह सबसे सुरक्षित गाड़ी चलाते समय Android Automotive OS के साथ इंटरैक्ट करें. इसलिए, हमने Android की आवाज़ से डिवाइस का इस्तेमाल करने की सुविधा देने वाले एपीआई (इसमें VoiceInteractionSession शामिल हैं) आवाज़ से डिवाइस का इस्तेमाल करने की सुविधा देने के लिए जिन्हें गाड़ी चलाते समय हासिल करना मुश्किल हो सकता है.

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

Automotive में, सूचना केंद्र पर पोस्ट की गई ऐसी सूचनाएं INBOX के तौर पर या INBOX_IN_GROUP (उदाहरण के लिए, एसएमएस मैसेज) में चलाएं बटन. चुने गए विकल्प को चुनने के लिए, उपयोगकर्ता चलाएं पर क्लिक कर सकता है वॉइस असिस्टेंट सूचना को ज़ोर से पढ़कर सुनाती है. साथ ही, बोलकर जवाब देने के लिए भी इसका इस्तेमाल किया जा सकता है.

टैप करके पढ़ने की सूचना

पहला डायग्राम. 'चलाएं' बटन की मदद से, पढ़ने के लिए टैप करने की सूचना पर टैप करें.

CarVoiceVoicesession के साथ जोड़ना

अगले सेक्शन में, वॉइस असिस्टेंट को इंटिग्रेट करने का तरीका बताया गया है CarVoiceInteractionSession.

वॉइस इंटरैक्शन का इस्तेमाल करें

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

CarVoiceVoice सर्टिफ़िकेशन को लागू करें

CarVoiceInteractionSession अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इससे ऐसे एपीआई दिखाए जाते हैं जिनका इस्तेमाल करके, वॉइस असिस्टेंट की मदद से मैसेज को ज़ोर से पढ़कर सुनाया जा सकता है. उपयोगकर्ता की ओर से थियो मैसेज का जवाब दें.

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

कारवॉइस इंटरैक्शन सेशन वॉइस इंटरैक्शन सेशन
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 चालू है या नहीं और ने मैसेज पढ़ लिया है, तो वॉइस असिस्टेंट को पेलोड में KEY_FALLBACK_ASSISTANT_ENABLED बूलियन वैल्यू.

यह प्लैटफ़ॉर्म, वॉइस असिस्टेंट की सुविधा के लिए, आवाज़ की सीमा तय करने वाला लॉजिक जोड़ने का सुझाव देता है इस अनुमति के लिए कितनी बार अनुरोध किया गया. ऐसा करना उस उपयोगकर्ता का सम्मान करता है जो वॉइस असिस्टेंट को यह अनुमति देना चाहते हैं और मैसेज को ज़ोर से पढ़ने के लिए FallbackAssistant. इससे प्रॉम्प्ट किया जा रहा है: उपयोगकर्ता जब भी किसी मैसेज की सूचना पर चलाएं बटन दबाता है, तो उसे अनुमति लेनी होती है उपयोगकर्ता अनुभव पर बुरा असर पड़ सकता है. यह प्लैटफ़ॉर्म, किराये की सीमाएं लागू नहीं करता अपनी आवाज़ की मदद से सेव करें.

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

StatusBarNotification के साथ काम करें

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

सूचनाओं की मदद से इंटरैक्शन को आसान बनाने के लिए, NotificationPayloadHandler का इस्तेमाल करें, जो सूचना से मैसेज निकालने और सूचना के जिस मकसद को मंज़ूरी मिलना बाकी है उस पर मैसेज का जवाब दें. इसके बाद वॉइस असिस्टेंट मैसेज को पढ़ता है. वॉइस असिस्टेंट को मार्क को सक्रिय करना ज़रूरी है 'रीड इंटेंट' के तौर पर.

टैप करके पढ़ने की पहले से जुड़ी शर्तों को पूरा करें

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

सीक्वेंस के डायग्राम

ये इमेज, CarVoiceInteractionSession actions के लॉजिक फ़्लो को दिखाती हैं:

VOICE_ACTION_READ_सूचना

दूसरा डायग्राम. VOICE_ACTION_READ_NOTIFICATION के लिए क्रम का डायग्राम.

इमेज 3 के मामले में, अनुमति के अनुरोधों पर रेट लिमिट के ऐप्लिकेशन का सुझाव दिया गया है:

VOICE_ACTION_REPLY_सूचना

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

VOICE_ACTION_HANDLE_EXCEPTION

चौथी इमेज. VOICE_ACTION_HANDLE_EXCEPTION के लिए क्रम का डायग्राम.

ऐप्लिकेशन का नाम पढ़ें

आवाज़ से डिवाइस का नाम: (उदाहरण के लिए, "Hangouts के सैम ने कहा..."), तो एक ऐसा फ़ंक्शन बनाएं नीचे दिए गए कोड उदाहरण में यह पक्का करने के लिए कि Assistant सही नाम पढ़ रही है:

@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;
}