Google Assistant और मीडिया ऐप्लिकेशन

Google Assistant की मदद से, बोलकर निर्देश दिए जा सकते हैं. इससे कई डिवाइसों को कंट्रोल किया जा सकता है, जैसे कि Google Home, आपका फ़ोन वगैरह. इसमें पहले से मौजूद मीडिया के निर्देशों को समझ पाते हैं ("बियॉन्से के कुछ चलाओ") और उनकी मदद करते हैं मीडिया कंट्रोल (जैसे कि रोकें, स्किप करें, फ़ास्ट फ़ॉरवर्ड करें, थंब्स अप).

Assistant मीडिया की मदद से, Android मीडिया ऐप्लिकेशन से बातचीत करती है सेशन के बारे में बात करते हैं. यह इन चीज़ों का इस्तेमाल कर सकता है इंटेंट या सेवाओं को अपना ऐप्लिकेशन लॉन्च करें और वीडियो चलाना शुरू करें. सबसे अच्छे नतीजे पाने के लिए, आपके ऐप्लिकेशन को यह करना चाहिए इस पेज पर बताई गई सभी सुविधाओं को लागू करना चाहिए.

मीडिया सेशन का इस्तेमाल करना

हर ऑडियो और वीडियो ऐप्लिकेशन के लिए यह ज़रूरी है कि मीडिया सेशन ताकि Assistant काम कर सके प्लेबैक शुरू होने के बाद ट्रांसपोर्ट कंट्रोल का इस्तेमाल करें.

ध्यान दें कि भले ही Assistant सिर्फ़ इस सेक्शन में बताई गई कार्रवाइयों का इस्तेमाल करती हो, लेकिन सबसे सही तरीका यह है कि तैयारी और वीडियो चलाने के सभी एपीआई लागू किए जाएं, ताकि यह पक्का किया जा सके कि अन्य ऐप्लिकेशन के साथ काम करता है या नहीं. ऐसी किसी भी कार्रवाई के लिए जिसे आपने अनुमति नहीं दी है, मीडिया सत्र कॉलबैक ERROR_CODE_NOT_SUPPORTED.

मीडिया और ट्रांसपोर्ट कंट्रोल को चालू करने के लिए, अपने ऐप्लिकेशन के MediaSession ऑब्जेक्ट:

Kotlin

session.setFlags(
        MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or
        MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)

Java

session.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

आपके ऐप्लिकेशन के मीडिया सेशन को उन कार्रवाइयों का एलान करना होगा जिन पर यह काम करता है. साथ ही, संबंधित मीडिया सेशन कॉलबैक. बताएं कि कौनसी कार्रवाइयां की जा सकती हैं setActions().

कॉन्टेंट बनाने यूनिवर्सल Android म्यूज़िक प्लेयर मीडिया सेशन सेट अप करने का एक अच्छा उदाहरण यह है कि सैंपल प्रोजेक्ट भी दिया जा सकता है.

प्लेबैक कार्रवाइयां

किसी सेवा पर वीडियो चलाने के लिए, मीडिया सेशन में ये PLAY कार्रवाइयां और उनके कॉलबैक होने चाहिए:

कार्रवाई कॉलबैक
ACTION_PLAY onPlay()
ACTION_PLAY_FROM_SEARCH onPlayFromSearch()
ACTION_PLAY_FROM_URI (*) onPlayFromUri()

आपके सेशन में ये PREPARE कार्रवाइयां और उनके कॉलबैक भी लागू होने चाहिए:

कार्रवाई कॉलबैक
ACTION_PREPARE onPrepare()
ACTION_PREPARE_FROM_SEARCH onPrepareFromSearch()
ACTION_PREPARE_FROM_URI (*) onPrepareFromUri()

(*) Google Assistant यूआरआई-आधारित कार्रवाइयों की सुविधा सिर्फ़ कंपनियों के लिए काम करती है जो Google को यूआरआई उपलब्ध कराती हैं. Google को अपने मीडिया कॉन्टेंट के बारे में बताने के बारे में ज़्यादा जानने के लिए मीडिया के लिए कार्रवाइयां देखें.

तैयारी करने वाले एपीआई लागू करने से, बोले गए निर्देश के बाद वीडियो चलने में लगने वाला समय बचता है कम किया जा सकता है. वे मीडिया ऐप्लिकेशन जो वीडियो चलाने में लगने वाला समय कम करना चाहते हैं, वे कॉन्टेंट को कैश मेमोरी में सेव करने और मीडिया प्लेबैक तैयार करने में ज़्यादा समय लग सकता है.

खोज क्वेरी को पार्स करें

जब कोई उपयोगकर्ता किसी खास मीडिया आइटम को खोजता है, जैसे कि "जैज़ चलाओ [your app name]” या “[song title] सुनो”, onPrepareFromSearch() या onPlayFromSearch() कॉलबैक वाले तरीके को क्वेरी पैरामीटर और एक्स्ट्रा बंडल मिलता है.

आपके ऐप्लिकेशन को वॉइस सर्च क्वेरी को पार्स करना चाहिए और इन निर्देशों का पालन करके वीडियो चलाना शुरू करना चाहिए चरण:

  1. वॉइस सर्च से मिले एक्स्ट्रा बंडल और सर्च क्वेरी स्ट्रिंग का इस्तेमाल करें नतीजों को फ़िल्टर करने के लिए.
  2. इन नतीजों के आधार पर वीडियो चलाने की सूची बनाएं.
  3. नतीजों में से सबसे काम का मीडिया आइटम चलाएं.

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

Android Automotive OS और Android Auto के लिए, ये अतिरिक्त सुविधाएं काम करती हैं:

नीचे दिया गया कोड स्निपेट, onPlayFromSearch() को बदलने का तरीका बताता है तरीका, आपके MediaSession.Callback में वॉइस सर्च क्वेरी को पार्स करने और प्लेबैक शुरू करने के लिए लागू करें:

Kotlin

override fun onPlayFromSearch(query: String?, extras: Bundle?) {
    if (query.isNullOrEmpty()) {
        // The user provided generic string e.g. 'Play music'
        // Build appropriate playlist queue
    } else {
        // Build a queue based on songs that match "query" or "extras" param
        val mediaFocus: String? = extras?.getString(MediaStore.EXTRA_MEDIA_FOCUS)
        if (mediaFocus == MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) {
            isArtistFocus = true
            artist = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST)
        } else if (mediaFocus == MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) {
            isAlbumFocus = true
            album = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM)
        }

        // Implement additional "extras" param filtering
    }

    // Implement your logic to retrieve the queue
    var result: String? = when {
        isArtistFocus -> artist?.also {
            searchMusicByArtist(it)
        }
        isAlbumFocus -> album?.also {
            searchMusicByAlbum(it)
        }
        else -> null
    }
    result = result ?: run {
        // No focus found, search by query for song title
        query?.also {
            searchMusicBySongTitle(it)
        }
    }

    if (result?.isNotEmpty() == true) {
        // Immediately start playing from the beginning of the search results
        // Implement your logic to start playing music
        playMusic(result)
    } else {
        // Handle no queue found. Stop playing if the app
        // is currently playing a song
    }
}

Java

@Override
public void onPlayFromSearch(String query, Bundle extras) {
    if (TextUtils.isEmpty(query)) {
        // The user provided generic string e.g. 'Play music'
        // Build appropriate playlist queue
    } else {
        // Build a queue based on songs that match "query" or "extras" param
        String mediaFocus = extras.getString(MediaStore.EXTRA_MEDIA_FOCUS);
        if (TextUtils.equals(mediaFocus,
                MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)) {
            isArtistFocus = true;
            artist = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST);
        } else if (TextUtils.equals(mediaFocus,
                MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE)) {
            isAlbumFocus = true;
            album = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM);
        }

        // Implement additional "extras" param filtering
    }

    // Implement your logic to retrieve the queue
    if (isArtistFocus) {
        result = searchMusicByArtist(artist);
    } else if (isAlbumFocus) {
        result = searchMusicByAlbum(album);
    }

    if (result == null) {
        // No focus found, search by query for song title
        result = searchMusicBySongTitle(query);
    }

    if (result != null && !result.isEmpty()) {
        // Immediately start playing from the beginning of the search results
        // Implement your logic to start playing music
        playMusic(result);
    } else {
        // Handle no queue found. Stop playing if the app
        // is currently playing a song
    }
}

ऑडियो चलाने के लिए, वॉइस सर्च की सुविधा को इस्तेमाल करने का तरीका जानने के लिए, देखने के लिए, यूनिवर्सल Android म्यूज़िक प्लेयर देखें सैंपल.

खाली क्वेरी हैंडल करना

अगर onPrepare(), onPlay(), onPrepareFromSearch() या onPlayFromSearch() बिना किसी खोज क्वेरी के कॉल किए जाते हैं, तो आपके मीडिया ऐप्लिकेशन को "वर्तमान" चलाना चाहिए मीडिया. अगर कोई मौजूदा मीडिया नहीं है, तो ऐप्लिकेशन को कुछ चलाने की कोशिश करनी चाहिए, जैसे कि हाल ही की प्लेलिस्ट में से किसी गाने या किसी भी सूची में शामिल करें. Assistant, ये एपीआई तब उपलब्ध होते हैं, जब कोई उपयोगकर्ता “[your app name] पर संगीत चलाओ” कहता है अतिरिक्त जानकारी.

जब कोई उपयोगकर्ता “[आपके ऐप्लिकेशन का नाम] पर संगीत चलाओ” कहता है, तो Android Automotive OS या Android Auto आपके ऐप्लिकेशन के onPlayFromSearch() को कॉल करके, आपका ऐप्लिकेशन लॉन्च करने और ऑडियो चलाने की कोशिश करता है तरीका. हालांकि, उपयोगकर्ता ने मीडिया आइटम का नाम नहीं बताया, इसलिए onPlayFromSearch() तरीके को खाली क्वेरी पैरामीटर मिलता है. इन मामलों में, आपके ऐप्लिकेशन को तुरंत कोई ऑडियो चलाकर जवाब दे सकते हैं, जैसे कि सबसे हाल ही का कोई गाना प्लेलिस्ट या किसी भी क्रम में चुनी गई सूची.

बोलकर फ़ोन का इस्तेमाल करने की सुविधा के लिए, लेगसी ऐप्लिकेशन का एलान करना

ज़्यादातर मामलों में, ऊपर बताई गई प्लेबैक कार्रवाइयों को मैनेज करने से, आपके ऐप्लिकेशन को सभी की ज़रूरत होती है. हालांकि, कुछ सिस्टम के लिए ज़रूरी है कि आपका ऐप्लिकेशन खोज के लिए इंटेंट फ़िल्टर शामिल हो. आपको इस इंटेंट के लिए काम करने का एलान करना चाहिए फ़िल्टर का इस्तेमाल करें.

किसी फ़ोन ऐप्लिकेशन के लिए मेनिफ़ेस्ट फ़ाइल में यह कोड शामिल करें:

<activity>
    <intent-filter>
        <action android:name=
             "android.media.action.MEDIA_PLAY_FROM_SEARCH" />
        <category android:name=
             "android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

ट्रांसपोर्ट कंट्रोल

आपके ऐप्लिकेशन का मीडिया सेशन चालू होने के बाद, Assistant बोलकर निर्देश दे सकती है मीडिया के मेटाडेटा को अपडेट करने और प्लेबैक कंट्रोल करने के लिए. इसे काम करने के लिए, आपके कोड को नीचे दी गई कार्रवाइयों को चालू करना चाहिए और संबंधित कार्रवाइयों को लागू करना चाहिए कॉलबैक:

कार्रवाई कॉलबैक ब्यौरा
ACTION_SKIP_TO_NEXT onSkipToNext() अगला वीडियो
ACTION_SKIP_TO_PREVIOUS onSkipToPrevious() पिछला गाना चलाएं
ACTION_PAUSE, ACTION_PLAY_PAUSE onPause() रोकें
ACTION_STOP onStop() रोकें
ACTION_PLAY onPlay() फिर से शुरू करें
ACTION_SEEK_TO onSeekTo() 30 सेकंड पीछे जाएं
ACTION_SET_RATING onSetRating(android.support.v4.media.RatingCompat) पसंद/नापसंद.
ACTION_SET_CAPTIONING_ENABLED onSetCaptioningEnabled(boolean) कैप्शन की सुविधा चालू या बंद करें.

कृपया ध्यान दें:

  • आगे-पीछे करने के निर्देश काम करें, इसके लिए PlaybackState को state, position, playback speed, and update time के साथ अप-टू-डेट होना चाहिए. स्थिति बदलने पर, ऐप्लिकेशन को setPlaybackState() को कॉल करना होगा.
  • मीडिया ऐप्लिकेशन को मीडिया सेशन का मेटाडेटा भी अप-टू-डेट रखना चाहिए. इससे "कौनसा गाना चल रहा है?" जैसे सवालों के जवाब मिल सकते हैं ज़रूरी फ़ील्ड (जैसे कि ट्रैक का टाइटल, कलाकार, और नाम) में बदलाव होने पर, ऐप्लिकेशन को setMetadata() को कॉल करना होगा.
  • MediaSession.setRatingType() को इस तरह की रेटिंग सेट करनी चाहिए कि ऐप्लिकेशन पर काम करती हो. साथ ही, ऐप्लिकेशन को onSetRating() लागू करनी होगी. अगर ऐप्लिकेशन में रेटिंग की सुविधा नहीं है, तो रेटिंग टाइप को RATING_NONE पर सेट किया जाना चाहिए.

बोलकर फ़ोन का इस्तेमाल करने की सुविधा, कॉन्टेंट के टाइप के हिसाब से अलग-अलग हो सकती है.

कॉन्टेंट किस तरह का है आवश्यक कार्रवाइयां
संगीत

यह सुविधा देना ज़रूरी है: चलाएं, रोकें, बंद करें, अगले वीडियो पर जाएं, और पिछले पेज पर जाएं

इसके लिए सहायता का सुझाव दें: ऐसा करने की कोशिश करें

पॉडकास्ट

सहायता देना ज़रूरी है: चलाएं, रोकें, बंद करें, और खोजें

इसके लिए सहायता का सुझाव दें: अगले पेज पर जाएं और पिछले पेज पर जाएं

ऑडियो बुक सहायता देना ज़रूरी है: चलाएं, रोकें, बंद करें, और खोजें
रेडियो मदद करना ज़रूरी है: चलाएं, रोकें, और बंद करें
समाचार यह सुविधा देना ज़रूरी है: चलाएं, रोकें, बंद करें, अगले वीडियो पर जाएं, और पिछले पेज पर जाएं
वीडियो

इनकी मदद करना: चलाना, रोकना, बंद करना, आगे बढ़ाना, पीछे ले जाना, और फ़ास्ट फ़ॉरवर्ड करना

इसके लिए सहायता का सुझाव ज़रूर दें: 'अगले पर जाएं' और 'पीछे जाएं' पर जाएं

आपको अपना प्रॉडक्ट ऑफ़र करने के लिए, ऊपर बताई गई सभी कार्रवाइयों को सपोर्ट करना होगा की अनुमति है, लेकिन फिर भी अन्य कार्रवाइयों के लिए ग्रेसफ़ुल तरीके से जवाब देते हैं. उदाहरण के लिए, अगर सिर्फ़ प्रीमियम उपयोगकर्ताओं के पास पिछले आइटम पर वापस जाने की सुविधा होती है. अगर फ़्री टीयर का कोई उपयोगकर्ता, Assistant को पिछले आइटम पर वापस जाने के लिए कहता है, तो गड़बड़ी का मैसेज दिखेगा. ज़्यादा जानकारी के लिए गड़बड़ियों को मैनेज करने वाला सेक्शन देखें.

इसे आज़माने के लिए, वॉइस क्वेरी के सैंपल

नीचे दी गई टेबल में कुछ सैंपल क्वेरी के बारे में बताया गया है. इनका इस्तेमाल ऐसी क्वेरी के लिए करना चाहिए जिन्हें आपको लागू करने की जांच करें:

Mediasession कॉलबैक “Ok Google” वाक्यांश का इस्तेमाल करें
onPlay()

"चलाओ."

“फिर शुरू करो।”

onPlayFromSearch()
onPlayFromUri()
संगीत

(app name) पर संगीत या गाने चलाओ.” यह एक खाली क्वेरी है.

(app name) पर (गाना | कलाकार | एल्बम | शैली | प्लेलिस्ट) चलाएं.”

रेडियो (app name) पर (frequency | Station) चलाओ.”
ऑडियो बुक

(app name) पर मेरी ऑडियो बुक पढ़ो.”

(app name) पर (ऑडियो बुक) पढ़ें.”

पॉडकास्ट (app name) पर (podcast) चलाओ.”
onPause() "रोको।"
onStop() "बंद करो।"
onSkipToNext() “अगला (गाना | एपिसोड | ट्रैक).”
onSkipToPrevious() “पिछला (गाना | एपिसोड | ट्रैक).”
onSeekTo()

"रीस्टार्ट करें."

## सेकंड आगे बढ़ें.”

## मिनट पीछे जाएं.”

लागू नहीं (अपना डेटा सेव रखें MediaMetadata अपडेट किया गया) “क्या चल रहा है?”

गड़बड़ियां

Assistant, मीडिया सेशन में होने वाली गड़बड़ियों को हैंडल करती है और उन्हें रिपोर्ट करती है उन्हें उपयोगकर्ताओं के लिए उपलब्ध कराया जाता है. पक्का करें कि आपके मीडिया सेशन में, ट्रांसपोर्ट का स्टेटस अपडेट हो और गड़बड़ी कोड के साथ उसके PlaybackState में सही तरीके से शामिल किया गया है, जैसा कि किसी गड़बड़ी को ठीक करने के लिए मीडिया सेशन. Assistant इसके ज़रिए लौटाए गए सभी गड़बड़ी कोड पहचानता है getErrorCode().

आम तौर पर, हैंडल नहीं किए जाने वाले मामले

यहां गड़बड़ी के उन मामलों के कुछ उदाहरण दिए गए हैं जिन्हें आपको ठीक से ठीक करना होगा सही ढंग से:

  • उपयोगकर्ता को साइन इन करना होगा
    • PlaybackState गड़बड़ी के कोड को ERROR_CODE_AUTHENTICATION_EXPIRED पर सेट करें.
    • PlaybackState गड़बड़ी का मैसेज सेट करें.
    • अगर प्लेबैक के लिए ज़रूरी हो, तो PlaybackState की स्थिति को STATE_ERROR पर सेट करें, अगर ऐसा नहीं है, तो PlaybackState को ऐसे ही रहने दें.
  • उपयोगकर्ता ने ऐसी कार्रवाई का अनुरोध किया है जो उपलब्ध नहीं है
    • PlaybackState गड़बड़ी कोड को सही तरीके से सेट करें. उदाहरण के लिए, PlaybackState से ERROR_CODE_NOT_SUPPORTED अगर कार्रवाई काम नहीं करती है या ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED अगर उस कार्रवाई से साइन-इन किया जा सकता है.
    • PlaybackState गड़बड़ी का मैसेज सेट करें.
    • PlaybackState को वैसे ही रहने दें.
  • उपयोगकर्ता का अनुरोध किया गया कॉन्टेंट, ऐप्लिकेशन में उपलब्ध नहीं है
    • PlaybackState गड़बड़ी कोड को सही तरीके से सेट करें. उदाहरण के लिए, ERROR_CODE_NOT_AVAILABLE_IN_REGION.
    • PlaybackState गड़बड़ी का मैसेज सेट करें.
    • वीडियो देखने में रुकावट डालने के लिए, PlaybackSate स्थिति को STATE_ERROR पर सेट करें. अगर ऐसा नहीं है, तो PlaybackState को पहले जैसा ही रहने दें.
  • उपयोगकर्ता ऐसे कॉन्टेंट का अनुरोध करता है जिसका एग्ज़ैक्ट मैच नहीं मिलता. उदाहरण के लिए, फ़्री-टियर उपयोगकर्ता, जिससे सिर्फ़ प्रीमियम लेवल के उपयोगकर्ताओं के लिए उपलब्ध कॉन्टेंट के बारे में पूछना हो.
    • हमारा सुझाव है कि आप कोई गड़बड़ी न दिखाएं. इसके बजाय, उन्हें पहले उससे मिलता-जुलता कॉन्टेंट ढूँढना. Assistant सबसे ज़्यादा बोलने पर हैंडल करेगी प्लेबैक शुरू होने से पहले आवाज़ से सही संकेत मिलना ज़रूरी है.

इंटेंट के साथ वीडियो चलाएं

Assistant कोई ऑडियो या वीडियो ऐप्लिकेशन लॉन्च कर सकती है और डीप लिंक के साथ इंटेंट करें.

इंटेंट और उसका डीप लिंक, अलग-अलग सोर्स से मिल सकता है:

  • जब Assistant तो यह Google Search का इस्तेमाल करके, ऐसी मार्कअप की गई कॉन्टेंट को वापस पा सकता है लिंक के साथ देखने की कार्रवाई दिखाता है.
  • जब Assistant कोई टीवी ऐप्लिकेशन शुरू करती है, तो आपके ऐप्लिकेशन में टीवी खोज सेवा देने वाली कंपनी का इस्तेमाल करें. Assistant इन्हें एक क्वेरी भेजती है तो कॉन्टेंट देने वाले को डीप लिंक के लिए यूआरआई वाले इंटेंट के बारे में बताना चाहिए और वैकल्पिक कार्रवाई. अगर क्वेरी से इंटेंट में कोई कार्रवाई मिलती है, तो Assistant उस कार्रवाई और यूआरआई को वापस आपके ऐप्लिकेशन पर भेज देती है. अगर सेवा देने वाली कंपनी ने इस बारे में नहीं बताया है, तो कोई कार्रवाई करने पर, Assistant, इंटेंट में ACTION_VIEW जोड़ देगी.

Assistant, true वैल्यू के साथ अतिरिक्त EXTRA_START_PLAYBACK जोड़ देती है इंटेंट पर भेजना होगा. ऐप्लिकेशन तब वीडियो चलना शुरू करेगा, जब EXTRA_START_PLAYBACK के साथ एक इंटेंट मिलता है.

ऐक्टिव होने पर इंटेंट हैंडल करना

जब आपका ऐप्लिकेशन चालू हो, तब उपयोगकर्ता Assistant से कुछ चलाने के लिए कह सकते हैं पिछले अनुरोध का कॉन्टेंट. इसका मतलब है कि आपके ऐप्लिकेशन को नए इंटेंट मिल सकते हैं, जब इसकी प्लेबैक गतिविधि पहले से लॉन्च हो और सक्रिय हो, तब प्लेबैक प्रारंभ करें.

डीप लिंक वाले इंटेंट के साथ काम करने वाली गतिविधियों को बदलना चाहिए onNewIntent() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है का इस्तेमाल किया जा सकता है.

वीडियो चलाना शुरू करते समय, Assistant और वीडियो जोड़ सकती है फ़्लैग इंटेंट पर भेजना होगा. विशेष रूप से, यह FLAG_ACTIVITY_CLEAR_TOP या FLAG_ACTIVITY_NEW_TASK या दोनों. हालांकि, आपका कोड को इन फ़्लैग को हैंडल करने की ज़रूरत नहीं होती, तो Android सिस्टम उनका जवाब देता है. नए यूआरआई के साथ वीडियो चलाने का दूसरा अनुरोध मिलने पर, आपके ऐप्लिकेशन के काम करने के तरीके पर इसका असर पड़ सकता है जब पिछला यूआरआई अब भी चल रहा हो. इस बात की जांच करना बेहतर होगा कि इस मामले में आपका ऐप्लिकेशन कैसे काम करता है. adb निर्देश का इस्तेमाल किया जा सकता है लाइन टूल की मदद से स्थिति को सिम्युलेट करें (कॉन्सटेंट 0x14000000, बूलियन बिट के अनुसार या दो फ़्लैग का OR है):

adb shell 'am start -a android.intent.action.VIEW --ez android.intent.extra.START_PLAYBACK true -d "<first_uri>"' -f 0x14000000
adb shell 'am start -a android.intent.action.VIEW --ez android.intent.extra.START_PLAYBACK true -d "<second_uri>"' -f 0x14000000

किसी सेवा से वीडियो चलाना

अगर आपके ऐप्लिकेशन में media browser service अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है की मदद से कनेक्ट करने की अनुमति दी जाती है. Assistant, सेवा देने वाली कंपनी से बातचीत करके ऐप्लिकेशन को चालू कर सकती है media session. मीडिया ब्राउज़र सेवा को कभी भी कोई ऐक्टिविटी लॉन्च नहीं करनी चाहिए. आपने जो PendingIntent तय किया है उसके आधार पर Assistant आपकी गतिविधि लॉन्च करेगी setsessionActivity() के साथ.

जब आप अपने मीडिया ब्राउज़र सेवा को शुरू करें. YouTube पर चलने वाली वीडियो चलाने की कार्रवाइयां सेट करना न भूलें हर समय, लागू करना भी शामिल है. Assistant को आपके मीडिया से उम्मीद है ऐप, Assistant के पहली बार वीडियो भेजने से पहले, वीडियो चलाने की कार्रवाइयाँ सेट कर सकता है आदेश.

किसी सेवा से शुरुआत करने के लिए, Assistant मीडिया ब्राउज़र क्लाइंट एपीआई लागू करती है. यह TransportControls कॉल को ऐसे ट्रिगर करता है जो आपके डिवाइस पर PLAY कार्रवाई कॉलबैक ट्रिगर करते हैं ऐप्लिकेशन के मीडिया सेशन में हिस्सा लेता है.

नीचे दिए गए डायग्राम में, Assistant और संबंधित मीडिया सेशन कॉलबैक. (तैयार कॉलबैक सिर्फ़ भेजे जाते हैं अगर आपके ऐप्लिकेशन में यह सुविधा काम करती है.) सभी कॉल एसिंक्रोनस होते हैं. Assistant ये काम नहीं करती अपने ऐप्स से किसी भी जवाब की इंतज़ार करें.

मीडिया सेशन के साथ वीडियो चलाना शुरू करना

जब कोई उपयोगकर्ता चलाने के लिए बोला गया निर्देश देता है, तो Assistant एक छोटी सी सूचना के साथ जवाब देती है. सूचना पूरी होते ही Assistant, 'Play कार्रवाई' चालू कर देती है. यह सुविधा वीडियो चलाने की किसी खास स्थिति का इंतज़ार नहीं करती.

अगर आपके ऐप्लिकेशन में ACTION_PREPARE_* कार्रवाइयाँ काम करती हैं, तो Assistant सूचना शुरू करने से पहले, PREPARE को कॉल करती है.

MediaBrowserService से कनेक्ट करना

अपना ऐप्लिकेशन चालू करने के लिए किसी सेवा का इस्तेमाल करने के लिए, Assistant यह ज़रूरी है कि वह ऐप्लिकेशन के MediaBrowserService और अपना Mediasession.Token वापस पाएं. कनेक्शन के अनुरोधों को सेवा onGetRoot() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है तरीका. अनुरोधों को मैनेज करने के दो तरीके हैं:

  • कनेक्शन के सभी अनुरोध स्वीकार करें
  • सिर्फ़ Assistant ऐप्लिकेशन से कनेक्शन के अनुरोध स्वीकार करें

कनेक्शन के सभी अनुरोध स्वीकार करें

Assistant को आपके मीडिया सेशन में निर्देश भेजने की अनुमति देने के लिए, आपको BrowserRoot करना होगा. सबसे आसान तरीका सभी MediaBrowser ऐप्स को अपने MediaBrowserService से कनेक्ट होने की अनुमति देना है. आपको बिना शून्य वाला BrowserRoot देना होगा. यहां यूनिवर्सल म्यूज़िक प्लेयर से मिला कोड दिया गया है:

Kotlin

override fun onGetRoot(
        clientPackageName: String,
        clientUid: Int,
        rootHints: Bundle?
): BrowserRoot? {

    // To ensure you are not allowing any arbitrary app to browse your app's contents, you
    // need to check the origin:
    if (!packageValidator.isCallerAllowed(this, clientPackageName, clientUid)) {
        // If the request comes from an untrusted package, return an empty browser root.
        // If you return null, then the media browser will not be able to connect and
        // no further calls will be made to other media browsing methods.
        Log.i(TAG, "OnGetRoot: Browsing NOT ALLOWED for unknown caller. Returning empty "
                + "browser root so all apps can use MediaController. $clientPackageName")
        return MediaBrowserServiceCompat.BrowserRoot(MEDIA_ID_EMPTY_ROOT, null)
    }

    // Return browser roots for browsing...
}

Java

@Override
public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid,
                             Bundle rootHints) {

    // To ensure you are not allowing any arbitrary app to browse your app's contents, you
    // need to check the origin:
    if (!packageValidator.isCallerAllowed(this, clientPackageName, clientUid)) {
        // If the request comes from an untrusted package, return an empty browser root.
        // If you return null, then the media browser will not be able to connect and
        // no further calls will be made to other media browsing methods.
        LogHelper.i(TAG, "OnGetRoot: Browsing NOT ALLOWED for unknown caller. "
                + "Returning empty browser root so all apps can use MediaController."
                + clientPackageName);
        return new MediaBrowserServiceCompat.BrowserRoot(MEDIA_ID_EMPTY_ROOT, null);
    }

    // Return browser roots for browsing...
}

Assistant ऐप्लिकेशन का पैकेज और हस्ताक्षर स्वीकार करें

आप Assistant के पैकेज का नाम और हस्ताक्षर देखकर, साफ़ तौर पर अपनी मीडिया ब्राउज़र सेवा से कनेक्ट करने की अनुमति दे सकते हैं. आपके ऐप्लिकेशन को आपके MediaBrowserService के onGetRoot तरीके में पैकेज नाम भेजा जाएगा. Assistant को आपके मीडिया सेशन में निर्देश भेजने की अनुमति देने के लिए, आपको BrowserRoot करना होगा. कॉन्टेंट बनाने यूनिवर्सल म्यूज़िक प्लेयर सैंपल में, जाने-पहचाने पैकेज के नामों और हस्ताक्षरों की सूची होती है. नीचे उन पैकेज के नाम और हस्ताक्षर दिए गए हैं जिनका इस्तेमाल Google Assistant करती है.

<signature name="Google" package="com.google.android.googlequicksearchbox">
    <key release="false">19:75:b2:f1:71:77:bc:89:a5:df:f3:1f:9e:64:a6:ca:e2:81:a5:3d:c1:d1:d5:9b:1d:14:7f:e1:c8:2a:fa:00</key>
    <key release="true">f0:fd:6c:5b:41:0f:25:cb:25:c3:b5:33:46:c8:97:2f:ae:30:f8:ee:74:11:df:91:04:80:ad:6b:2d:60:db:83</key>
</signature>

<signature name="Google Assistant on Android Automotive OS" package="com.google.android.carassistant">
    <key release="false">17:E2:81:11:06:2F:97:A8:60:79:7A:83:70:5B:F8:2C:7C:C0:29:35:56:6D:46:22:BC:4E:CF:EE:1B:EB:F8:15</key>
    <key release="true">74:B6:FB:F7:10:E8:D9:0D:44:D3:40:12:58:89:B4:23:06:A6:2C:43:79:D0:E5:A6:62:20:E3:A6:8A:BF:90:E2</key>
</signature>