कार के लिए मीडिया ऐप्लिकेशन बनाएं

Android Auto और Android Automotive OS की मदद से, अपने मीडिया ऐप्लिकेशन का कॉन्टेंट उपयोगकर्ताओं को अपनी कार में वापस ला सकते हैं. कार में इस्तेमाल होने वाले मीडिया ऐप्लिकेशन को, मीडिया ब्राउज़र की सेवा देनी होगी ताकि Android Auto और Android Automotive OS या मीडिया वाला कोई दूसरा ऐप्लिकेशन हो आपके कॉन्टेंट को खोज और दिखा सकता है.

यह गाइड मान लेती है कि आपके पास पहले से ही ऐसा मीडिया ऐप्लिकेशन है जो फ़ोन पर यह पक्का करें कि आपका मीडिया ऐप्लिकेशन Android मीडिया ऐप्लिकेशन के मुताबिक हो आर्किटेक्चर चुनें.

इस गाइड में, MediaBrowserService और Android Auto या Android पर काम करने के लिए आपके ऐप्लिकेशन के लिए MediaSession की ज़रूरत Automotive ओएस. मुख्य मीडिया इंफ़्रास्ट्रक्चर पूरा करने के बाद, Android Auto के लिए सहायता जोड़ें और इसके लिए सहायता जोड़ें Android Automotive OS को आपके मीडिया के लिए है.

शुरू करने से पहले

  1. Android Media API का दस्तावेज़ पढ़ें.
  2. मीडिया ऐप्लिकेशन बनाना लेख पढ़ें देखें.
  3. इस सेक्शन में दिए गए खास शब्दों और सिद्धांतों को ध्यान से पढ़ें.

मुख्य शब्द और सिद्धांत

मीडिया ब्राउज़र सेवा
आपके मीडिया ऐप्लिकेशन की ओर से लागू की गई ऐसी Android सेवा जो MediaBrowserServiceCompat एपीआई. आपका ऐप्लिकेशन, अपना कॉन्टेंट दिखाने के लिए इस सेवा का इस्तेमाल करता है.
मीडिया ब्राउज़र
मीडिया ऐप्लिकेशन, मीडिया ब्राउज़र सेवाएं खोजने और डिसप्ले के लिए इस्तेमाल होने वाला एपीआई कॉन्टेंट मिलते हैं. Android Auto और Android Automotive OS इन कामों के लिए मीडिया ब्राउज़र का इस्तेमाल करते हैं अपने ऐप्लिकेशन की मीडिया ब्राउज़र सेवा ढूंढें.
मीडिया आइटम

मीडिया ब्राउज़र अपने कॉन्टेंट को MediaItem के ट्री में व्यवस्थित करता है ऑब्जेक्ट हैं. किसी मीडिया आइटम में, इनमें से कोई एक या दोनों फ़्लैग हो सकते हैं:

  • FLAG_PLAYABLE: इससे पता चलता है कि आइटम, कॉन्टेंट ट्री पर मौजूद एक लीफ़ है. आइटम किसी एक साउंड स्ट्रीम को दिखाता है. जैसे, किसी एल्बम का कोई गाना, ऑडियो बुक के किसी चैप्टर या पॉडकास्ट के एपिसोड में से कोई एक.
  • FLAG_BROWSABLE: इससे पता चलता है कि आइटम, कॉन्टेंट ट्री पर एक नोड है और यह बच्चे हैं. उदाहरण के लिए, आइटम किसी एल्बम को दिखाता है और इसके चिल्ड्रन (बच्चे) हैं एल्बम के गाने सुनना पसंद करते हैं.

ऐसा मीडिया आइटम जिसे ब्राउज़ किया जा सकता है और चलाया जा सकता है, जो प्लेलिस्ट की तरह काम करता है. आप आइटम के सभी बच्चों को चलाने के लिए खुद चुनें, या आप इसे ब्राउज़ कर सकते हैं बच्चे.

वाहन के लिए ऑप्टिमाइज़

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

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

आपको Android Auto के लिए गतिविधियां डिज़ाइन करने की ज़रूरत नहीं है, क्योंकि Android Auto इससे मिलती-जुलती जानकारी का इस्तेमाल करके, वाहन के लिए ऑप्टिमाइज़ किया गया अपना इंटरफ़ेस बनाता है मीडिया ब्राउज़र सेवा.

अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइलें कॉन्फ़िगर करें

अपनी मीडिया ब्राउज़र सेवा बनाने से पहले, आपको अपनी ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइलें शामिल होती हैं.

अपनी मीडिया ब्राउज़र सेवा का एलान करना

Android Auto और Android Automotive OS, दोनों आपके ऐप्लिकेशन से कनेक्ट होने के लिए आपके मीडिया ब्राउज़र सेवा. अपने मीडिया का एलान करना अपनी मेनिफ़ेस्ट फ़ाइल में ब्राउज़र सेवा जोड़ें. इससे Android Auto और Android Automotive OS की सुविधा काम करती है अपने ऐप्लिकेशन से कनेक्ट करें.

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

<application>
    ...
    <service android:name=".MyMediaBrowserService"
             android:exported="true">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService"/>
        </intent-filter>
    </service>
    ...
</application>

ऐप्लिकेशन के आइकॉन के बारे में बताएं

आपको उन ऐप्लिकेशन आइकॉन की जानकारी देनी होगी जिन्हें Android Auto और Android Automotive OS कर सकते हैं का इस्तेमाल सिस्टम यूज़र इंटरफ़ेस (यूआई) में आपके ऐप्लिकेशन को दिखाने के लिए करें. आइकॉन के दो टाइप ज़रूरी हैं:

  • लॉन्चर आइकॉन
  • एट्रिब्यूशन का आइकॉन

लॉन्चर आइकॉन

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

<application
    ...
    android:icon="@mipmap/ic_launcher"
    ...
/>

अपने मोबाइल ऐप्लिकेशन के आइकॉन से अलग आइकॉन का इस्तेमाल करने के लिए, android:icon प्रॉपर्टी सेट करें मेनिफ़ेस्ट में आपकी मीडिया ब्राउज़र सेवा के <service> एलिमेंट पर:

<application>
    ...
    <service
        ...
        android:icon="@mipmap/auto_launcher"
        ...
    />
</application>

एट्रिब्यूशन का आइकॉन

पहला डायग्राम. मीडिया कार्ड पर एट्रिब्यूशन आइकॉन.

एट्रिब्यूशन आइकॉन का इस्तेमाल उन जगहों में किया जाता है जहां मीडिया कॉन्टेंट को प्राथमिकता दी जाती है, जैसे कि मीडिया कार्ड पर. सूचनाओं के लिए इस्तेमाल होने वाले छोटे आइकॉन का फिर से इस्तेमाल करें. यह आइकॉन मोनोक्रोम होना चाहिए. आप एक ऐसा आइकॉन तय कर सकते हैं जिसका इस्तेमाल नीचे दिए गए मेनिफ़ेस्ट फ़ाइल का इस्तेमाल करके, अपना ऐप्लिकेशन अपडेट करें:

<application>
    ...
    <meta-data
        android:name="androidx.car.app.TintableAttributionIcon"
        android:resource="@drawable/ic_status_icon" />
    ...
</application>

अपनी मीडिया ब्राउज़र सेवा बनाएं

MediaBrowserServiceCompat की अवधि बढ़ाकर, मीडिया ब्राउज़र सेवा बनाई जा सकती है क्लास. इसके बाद, Android Auto और Android Automotive OS, दोनों आपकी सेवा का इस्तेमाल कर सकते हैं इसके लिए, आपको ये काम करने होंगे:

  • उपयोगकर्ता को मेन्यू दिखाने के लिए, अपने ऐप्लिकेशन में कॉन्टेंट की हैरारकी को ब्राउज़ करें.
  • अपने ऐप्लिकेशन के MediaSessionCompat के लिए टोकन पाएं ऑडियो प्लेबैक को कंट्रोल करने के लिए ऑब्जेक्ट कर सकते हैं.

अन्य क्लाइंट को अपने विज्ञापन दिखाने के लिए, आप मीडिया ब्राउज़र सेवा का भी इस्तेमाल कर सकते हैं आपके ऐप्लिकेशन से मीडिया कॉन्टेंट ऐक्सेस करने की अनुमति दें. ये मीडिया क्लाइंट, Google News उपयोगकर्ता का फ़ोन मिल सकता है या वे अन्य रिमोट क्लाइंट हो सकते हैं.

मीडिया ब्राउज़र सर्विस वर्कफ़्लो

इस सेक्शन में बताया गया है कि कैसे Android Automotive OS और Android उपयोगकर्ता के सामान्य वर्कफ़्लो के दौरान, मीडिया ब्राउज़र सेवा के साथ अपने-आप इंटरैक्ट करें.

  1. उपयोगकर्ता ने Android Automotive OS या Android Auto पर आपका ऐप्लिकेशन लॉन्च किया हो.
  2. Android Automotive OS या Android Auto आपके ऐप्लिकेशन के मीडिया ब्राउज़र से संपर्क करता है onCreate() का इस्तेमाल करने वाली सेवा तरीका. onCreate() को लागू करने में तरीका है, तो आपको MediaSessionCompat बनाना और रजिस्टर करना होगा ऑब्जेक्ट और उसका कॉलबैक ऑब्जेक्ट होता है.
  3. Android Automotive OS या Android Auto, आपकी सेवा के onGetRoot() को कॉल करता है पाने का तरीका बताएं. रूट मीडिया आइटम दिखाया नहीं गया है; इसके बजाय, उसका इस्तेमाल आपके ऐप्लिकेशन से ज़्यादा कॉन्टेंट वापस पाने के लिए किया जाता है.
  4. Android Automotive OS या Android Auto आपकी सेवाओं को onLoadChildren() रूट मीडिया आइटम का चाइल्ड पाने का तरीका. Android Automotive OS और Android Auto इन मीडिया आइटम को कॉन्टेंट आइटम के टॉप लेवल के तौर पर दिखाता है. यहां जाएं: ज़्यादा जानकारी के लिए इस पेज पर रूट मेन्यू का स्ट्रक्चर तैयार करें देखें कि सिस्टम इस लेवल पर क्या उम्मीद करता है.
  5. अगर उपयोगकर्ता ब्राउज़ किए जा सकने वाले मीडिया आइटम को चुनता है, तो आपकी सेवा onLoadChildren() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है चुने गए मेन्यू आइटम के चाइल्ड आइटम पाने के लिए, तरीके को फिर से कॉल किया जाता है.
  6. अगर उपयोगकर्ता, चलाए जा सकने वाले मीडिया आइटम, Android Automotive OS या Android को चुनता है यह कार्रवाई करने के लिए, अपने-आप सही मीडिया सेशन कॉलबैक तरीके को कॉल करता है.
  7. अगर आपके ऐप्लिकेशन के लिए यह सुविधा काम करती है, तो उपयोगकर्ता आपका कॉन्टेंट भी खोज सकते हैं. इसमें मामला, Android Automotive OS या Android Auto onSearch() तरीका.

अपने कॉन्टेंट की हैरारकी तैयार करना

Android Auto और Android Automotive OS आपके ऐप्लिकेशन की मीडिया ब्राउज़र सेवा को देखें कि कौनसा वीडियो उपलब्ध है. आपको अपने खाते में दो तरीके लागू करने होंगे मीडिया ब्राउज़र सेवा: onGetRoot() और onLoadChildren()

onGetRoot लागू करें

आपकी सेवा onGetRoot() तरीका, कॉन्टेंट हैरारकी के रूट नोड के बारे में जानकारी दिखाता है. Android Auto और Android Automotive OS, बाकी बचे डेटा का अनुरोध करने के लिए इस रूट नोड का इस्तेमाल करते हैं का इस्तेमाल करके अपने कॉन्टेंट को onLoadChildren() तरीका.

नीचे दिया गया कोड स्निपेट, onGetRoot() तरीका:

Kotlin

override fun onGetRoot(
    clientPackageName: String,
    clientUid: Int,
    rootHints: Bundle?
): BrowserRoot? =
    // Verify that the specified package is allowed to access your
    // content. You'll need to write your own logic to do this.
    if (!isValid(clientPackageName, clientUid)) {
        // If the request comes from an untrusted package, return null.
        // No further calls will be made to other media browsing methods.

        null
    } else MediaBrowserServiceCompat.BrowserRoot(MY_MEDIA_ROOT_ID, null)

Java

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

    // Verify that the specified package is allowed to access your
    // content. You'll need to write your own logic to do this.
    if (!isValid(clientPackageName, clientUid)) {
        // If the request comes from an untrusted package, return null.
        // No further calls will be made to other media browsing methods.

        return null;
    }

    return new MediaBrowserServiceCompat.BrowserRoot(MY_MEDIA_ROOT_ID, null);
}

इस तरीके की ज़्यादा जानकारी वाले उदाहरण के लिए, onGetRoot() देखें GitHub पर Universal Android Music Player सैंपल ऐप्लिकेशन में मिलेगा.

onGetRoot() के लिए पैकेज की पुष्टि करने की प्रक्रिया जोड़ें

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

Android Auto और Android Automotive OS जैसे सिस्टम ऐप्लिकेशन उपलब्ध कराने के लिए, अगर आपका कॉन्टेंट ऐक्सेस करना है, तो आपकी सेवा को हमेशा ऐसी वैल्यू दिखानी होगी जो शून्य नहीं हो जब ये सिस्टम ऐप्लिकेशन onGetRoot() को कॉल करते हैं, तो BrowserRoot तरीका. Android Automotive OS वाले सिस्टम ऐप्लिकेशन की हस्ताक्षर, हर स्थिति के हिसाब से अलग-अलग हो सकती हैं कार के मेक और मॉडल के हिसाब से, आपको सभी सिग्नल लेने की अनुमति देनी होगी. Android Automotive OS के साथ ज़्यादा तेज़ी से काम करने में मदद मिलेगी.

नीचे दिया गया कोड स्निपेट दिखाता है कि आपकी सेवा कॉलिंग पैकेज एक सिस्टम ऐप्लिकेशन है:

fun isKnownCaller(
    callingPackage: String,
    callingUid: Int
): Boolean {
    ...
    val isCallerKnown = when {
       // If the system is making the call, allow it.
       callingUid == Process.SYSTEM_UID -> true
       // If the app was signed by the same certificate as the platform
       // itself, also allow it.
       callerSignature == platformSignature -> true
       // ... more cases
    }
    return isCallerKnown
}

यह कोड स्निपेट, PackageValidator से लिया गया है क्लास में शामिल हों. वह क्लास देखें देखें कि आपके लिए पैकेज की पुष्टि कैसे की जाती है. सेवा का onGetRoot() तरीका.

सिस्टम ऐप्लिकेशन को अनुमति देने के अलावा, आपको Google Assistant को अपने MediaBrowserService से कनेक्ट करें. ध्यान दें कि Google Assistant के पास पैकेज के अलग-अलग नाम Android Auto के साथ-साथ Android Automotive OS वाले फ़ोन के लिए भी.

onLoad Children() लागू करें

रूट नोड ऑब्जेक्ट मिलने के बाद, Android Auto और Android Automotive OS onLoadChildren() पर कॉल करके टॉप लेवल मेन्यू बनाएं का उपयोग करें. क्लाइंट ऐप्लिकेशन इसके ज़रिए सबमेन्यू बनाते हैं चाइल्ड नोड ऑब्जेक्ट का इस्तेमाल करके इस तरीके को कॉल करें.

आपके कॉन्टेंट की हैरारकी में हर नोड को MediaBrowserCompat.MediaItem से दिखाया जाता है ऑब्जेक्ट है. इनमें से हर मीडिया आइटम की पहचान, यूनीक आईडी स्ट्रिंग से की जाती है. क्लाइंट ऐप्लिकेशन, इन आईडी स्ट्रिंग को ओपेक टोकन मानते हैं. जब कोई क्लाइंट ऐप्लिकेशन ब्राउज़ करना चाहता है किसी सबमेन्यू में या मीडिया आइटम चलाने पर, यह टोकन को पास कर देता है. आपका ऐप्लिकेशन ज़िम्मेदार है का इस्तेमाल, टोकन को सही मीडिया आइटम के साथ जोड़ने के लिए किया जाता है.

नीचे दिया गया कोड स्निपेट, onLoadChildren() को आसानी से लागू करने का तरीका दिखाता है तरीका:

Kotlin

override fun onLoadChildren(
    parentMediaId: String,
    result: Result<List<MediaBrowserCompat.MediaItem>>
) {
    // Assume for example that the music catalog is already loaded/cached.

    val mediaItems: MutableList<MediaBrowserCompat.MediaItem> = mutableListOf()

    // Check whether this is the root menu:
    if (MY_MEDIA_ROOT_ID == parentMediaId) {

        // Build the MediaItem objects for the top level
        // and put them in the mediaItems list.
    } else {

        // Examine the passed parentMediaId to see which submenu we're at
        // and put the children of that menu in the mediaItems list.
    }
    result.sendResult(mediaItems)
}

Java

@Override
public void onLoadChildren(final String parentMediaId,
    final Result<List<MediaBrowserCompat.MediaItem>> result) {

    // Assume for example that the music catalog is already loaded/cached.

    List<MediaBrowserCompat.MediaItem> mediaItems = new ArrayList<>();

    // Check whether this is the root menu:
    if (MY_MEDIA_ROOT_ID.equals(parentMediaId)) {

        // Build the MediaItem objects for the top level
        // and put them in the mediaItems list.
    } else {

        // Examine the passed parentMediaId to see which submenu we're at
        // and put the children of that menu in the mediaItems list.
    }
    result.sendResult(mediaItems);
}

इस विधि के संपूर्ण उदाहरण के लिए, देखें onLoadChildren() GitHub पर Universal Android Music Player सैंपल ऐप्लिकेशन में मिलेगा.

रूट मेन्यू व्यवस्थित करें

दूसरा डायग्राम. नेविगेशन टैब के तौर पर दिखाया गया रूट कॉन्टेंट.

Android Auto और Android Automotive OS की कुछ खास सीमाएं हैं, जो रूट मेन्यू का स्ट्रक्चर. इनकी जानकारी MediaBrowserService को दी गई है रूट संकेतों के माध्यम से, जिन्हें पास किए गए Bundle तर्क से पढ़ा जा सकता है onGetRoot(). इन संकेतों का पालन करने पर सिस्टम, रूट कॉन्टेंट को बेहतर तरीके से दिखा पाता है का भी इस्तेमाल कर सकते हैं. अगर इन सुझावों को फ़ॉलो नहीं किया जाता है, तो कुछ रूट कॉन्टेंट उसे सिस्टम से ड्रॉप या खोजे जाने लायक न बनाया जाए. दो हिंट भेजे गए हैं:

सही रूट संकेतों को पढ़ने के लिए इस कोड का इस्तेमाल करें:

Kotlin

import androidx.media.utils.MediaConstants

// Later, in your MediaBrowserServiceCompat.
override fun onGetRoot(
    clientPackageName: String,
    clientUid: Int,
    rootHints: Bundle
): BrowserRoot {

  val maximumRootChildLimit = rootHints.getInt(
      MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT,
      /* defaultValue= */ 4)
  val supportedRootChildFlags = rootHints.getInt(
      MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS,
      /* defaultValue= */ MediaItem.FLAG_BROWSABLE)

  // Rest of method...
}

Java

import androidx.media.utils.MediaConstants;

// Later, in your MediaBrowserServiceCompat.
@Override
public BrowserRoot onGetRoot(
    String clientPackageName, int clientUid, Bundle rootHints) {

    int maximumRootChildLimit = rootHints.getInt(
        MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT,
        /* defaultValue= */ 4);
    int supportedRootChildFlags = rootHints.getInt(
        MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS,
        /* defaultValue= */ MediaItem.FLAG_BROWSABLE);

    // Rest of method...
}

कॉन्टेंट की हैरारकी के लिए लॉजिक को चुना जा सकता है इन संकेतों के मानों के आधार पर सेट किए जाते हैं, खास तौर पर तब जब इन संकेतों के बीच आपका पदानुक्रम अलग-अलग हो MediaBrowser इंटिग्रेशन, जो Android Auto और Android Automotive OS के बाहर के हैं. उदाहरण के लिए, अगर आपको आम तौर पर रूट चलाने लायक आइटम दिखाया जाता है, तो हो सकता है कि आप उसे नेस्ट करना चाहें ब्राउज़ किए जा सकने वाले रूट आइटम के तहत होनी चाहिए, क्योंकि इस्तेमाल किए जा सकने वाले फ़्लैग की वैल्यू संकेत.

रूट हिंट के अलावा, कुछ और दिशा-निर्देश हैं जिनका पालन करना बाकी है ताकि यह पक्का किया जा सके कि टैब सही तरीके से रेंडर हों:

  • हर टैब आइटम के लिए मोनोक्रोम (खास तौर पर सफ़ेद) आइकॉन उपलब्ध कराएं.
  • हर टैब आइटम के लिए छोटे लेकिन सही लेबल दें. लेबल छोटे रखें स्ट्रिंग के छोटे होने की संभावना कम हो जाती है.

मीडिया आर्टवर्क दिखाएं

मीडिया आइटम के आर्टवर्क को इनमें से किसी एक का इस्तेमाल करके लोकल यूआरआई के तौर पर पास किया जाना चाहिए ContentResolver.SCHEME_CONTENT या ContentResolver.SCHEME_ANDROID_RESOURCE. इस स्थानीय यूआरआई को बिट मैप या लेख पढ़ें. इसमें मौजूद आइटम के बारे में बताने वाले MediaDescriptionCompat ऑब्जेक्ट के लिए कॉन्टेंट हैरारकी के हिसाब से, यूआरआई को setIconUri() से पास करें. अभी चल रहे आइटम को दिखाने वाले MediaMetadataCompat ऑब्जेक्ट के लिए, इसे पास करें putString() तक के यूआरआई, इनमें से किसी भी कुंजी का इस्तेमाल करके:

यहां दिए गए तरीके में, वेब यूआरआई से आर्ट डाउनलोड करने और उन्हें सार्वजनिक करने का तरीका बताया गया है स्थानीय यूआरआई के ज़रिए भेजा है. बेहतर उदाहरण के लिए, देखें लागू करना में सेव किया गया है. इसमें शामिल हैं: openFile() और इसके आस-पास के तरीके प्लेयर सैंपल ऐप्लिकेशन.

  1. वेब यूआरआई के मुताबिक content:// यूआरआई बनाएं. मीडिया ब्राउज़र सेवा और मीडिया सेशन इस कॉन्टेंट यूआरआई को Android Auto पर पास करते हैं और Android Automotive OS.

    Kotlin

    fun Uri.asAlbumArtContentURI(): Uri {
      return Uri.Builder()
        .scheme(ContentResolver.SCHEME_CONTENT)
        .authority(CONTENT_PROVIDER_AUTHORITY)
        .appendPath(this.getPath()) // Make sure you trust the URI
        .build()
    }
    

    Java

    public static Uri asAlbumArtContentURI(Uri webUri) {
      return new Uri.Builder()
        .scheme(ContentResolver.SCHEME_CONTENT)
        .authority(CONTENT_PROVIDER_AUTHORITY)
        .appendPath(webUri.getPath()) // Make sure you trust the URI!
        .build();
    }
    
  2. ContentProvider.openFile() को लागू करते समय, जांच लें कि संबंधित यूआरआई के लिए मौजूद है. अगर ऐसा नहीं है, तो इमेज फ़ाइल को डाउनलोड और कैश मेमोरी में सेव करें. कॉन्टेंट बनाने नीचे दिया गया कोड स्निपेट Glide का इस्तेमाल करता है.

    Kotlin

    override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor? {
      val context = this.context ?: return null
      val file = File(context.cacheDir, uri.path)
      if (!file.exists()) {
        val remoteUri = Uri.Builder()
            .scheme("https")
            .authority("my-image-site")
            .appendPath(uri.path)
            .build()
        val cacheFile = Glide.with(context)
            .asFile()
            .load(remoteUri)
            .submit()
            .get(DOWNLOAD_TIMEOUT_SECONDS, TimeUnit.SECONDS)
    
        cacheFile.renameTo(file)
        file = cacheFile
      }
      return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    }
    

    Java

    @Nullable
    @Override
    public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode)
        throws FileNotFoundException {
      Context context = this.getContext();
      File file = new File(context.getCacheDir(), uri.getPath());
      if (!file.exists()) {
        Uri remoteUri = new Uri.Builder()
            .scheme("https")
            .authority("my-image-site")
            .appendPath(uri.getPath())
            .build();
        File cacheFile = Glide.with(context)
            .asFile()
            .load(remoteUri)
            .submit()
            .get(DOWNLOAD_TIMEOUT_SECONDS, TimeUnit.SECONDS);
    
        cacheFile.renameTo(file);
        file = cacheFile;
      }
      return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    }
    

कॉन्टेंट देने वाले लोगों के बारे में ज़्यादा जानने के लिए, वीडियो बनाना कंपनी.

कॉन्टेंट स्टाइल लागू करें

ब्राउज़ किए जा सकने वाले या Playables वाले आइटम का इस्तेमाल करके, कॉन्टेंट की हैरारकी बनाने के बाद, आपको कॉन्टेंट स्टाइल को लागू कर सकता है, जिससे यह तय होगा कि कार में वे आइटम किस तरह दिखेंगे.

इन कॉन्टेंट स्टाइल का इस्तेमाल किया जा सकता है:

आइटम की सूची

कॉन्टेंट की इस स्टाइल में, इमेज के बजाय टाइटल और मेटाडेटा को प्राथमिकता दी जाती है.

ग्रिड आइटम

कॉन्टेंट की इस स्टाइल में, टाइटल और मेटाडेटा के बजाय इमेज को प्राथमिकता दी जाती है.

कॉन्टेंट के लिए डिफ़ॉल्ट स्टाइल सेट करना

आपके पास यह तय करने का विकल्प होता है कि आपके मीडिया आइटम किस तरह दिखें. इसके लिए, ग्लोबल डिफ़ॉल्ट सेटिंग सेट करें: आपकी सर्विस के BrowserRoot अतिरिक्त बंडल में कुछ कॉन्सटेंट onGetRoot() तरीका. Android Auto और Android Automotive OS ने इस बंडल को पढ़कर, इसे खोजा ताकि सही स्टाइल तय की जा सके.

बंडल में नीचे दी गई अतिरिक्त सुविधाओं का इस्तेमाल कुंजियों के तौर पर किया जा सकता है:

  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE: ब्राउज़ ट्री में, ब्राउज़ किए जा सकने वाले सभी आइटम के लिए प्रज़ेंटेशन संकेत दिखाता है.
  • DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE: ब्राउज़ ट्री में चलने वाले सभी आइटम के लिए प्रज़ेंटेशन संकेत दिखाता है.

कुंजियां, नीचे दिए गए पूर्णांक कॉन्सटेंट वैल्यू को मैप कर सकती हैं, ताकि प्रज़ेंटेशन में नीचे दी गई चीज़ें शामिल होती हैं:

  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM: संबंधित आइटम, सूची आइटम के तौर पर दिखाए जाते हैं.
  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM: मिलते-जुलते आइटम को ग्रिड आइटम के तौर पर दिखाया जाता है.
  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM: संबंधित आइटम "कैटगरी" के तौर पर दिखाए जाते हैं सूची आइटम. ये हैं यह सामान्य सूची आइटम के समान है, लेकिन इसमें मार्जिन लागू नहीं होते हैं आइटम' आइकॉन, क्योंकि आइकॉन छोटे होने पर बेहतर दिखते हैं. आइकॉन ड्रॉ करने लायक रंगीन वेक्टर होना चाहिए. यह संकेत सिर्फ़ दिए जाने की उम्मीद है ब्राउज़ किए जा सकने वाले आइटम के लिए.
  • DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM: संबंधित आइटम "कैटगरी" के तौर पर दिखाए जाते हैं ग्रिड आइटम. ये हैं यह सामान्य ग्रिड आइटम की तरह होता है, लेकिन इसके चारों तरफ़ मार्जिन लगा दिए जाते हैं आइटम' आइकॉन, क्योंकि आइकॉन छोटे होने पर बेहतर दिखते हैं. आइकॉन ड्रॉ करने लायक रंगीन वेक्टर होना चाहिए. यह संकेत सिर्फ़ दिए जाने की उम्मीद है ब्राउज़ किए जा सकने वाले आइटम के लिए.

नीचे दिया गया कोड स्निपेट, ग्रिड में ब्राउज़ किए जा सकने वाले आइटम और सूची में चलाने लायक आइटम:

Kotlin

import androidx.media.utils.MediaConstants

@Nullable
override fun onGetRoot(
    @NonNull clientPackageName: String,
    clientUid: Int,
    @Nullable rootHints: Bundle
): BrowserRoot {
    val extras = Bundle()
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
    return BrowserRoot(ROOT_ID, extras)
}

Java

import androidx.media.utils.MediaConstants;

@Nullable
@Override
public BrowserRoot onGetRoot(
    @NonNull String clientPackageName,
    int clientUid,
    @Nullable Bundle rootHints) {
    Bundle extras = new Bundle();
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
    return new BrowserRoot(ROOT_ID, extras);
}

हर आइटम के लिए कॉन्टेंट की स्टाइल सेट करें

Content Style API का इस्तेमाल करके, किसी ब्राउज़ किए जा सकने वाले मीडिया आइटम के चाइल्ड आइटम के साथ-साथ कोई भी मीडिया आइटम.

ब्राउज़ किए जा सकने वाले मीडिया आइटम के बच्चे के लिए, डिफ़ॉल्ट सेटिंग को बदलने के लिए, मीडिया आइटम के MediaDescription में अतिरिक्त बंडल जोड़ें और उसे जोड़ें पहले बताए गए संकेत. DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है उस आइटम में मौजूद बच्चों पर लागू होता है, जबकि DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE उस आइटम पर लागू होता है ब्राउज़ किए जा सकने वाले बच्चे.

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

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

Kotlin

import androidx.media.utils.MediaConstants

private fun createBrowsableMediaItem(
    mediaId: String,
    folderName: String,
    iconUri: Uri
): MediaBrowser.MediaItem {
    val mediaDescriptionBuilder = MediaDescription.Builder()
    mediaDescriptionBuilder.setMediaId(mediaId)
    mediaDescriptionBuilder.setTitle(folderName)
    mediaDescriptionBuilder.setIconUri(iconUri)
    val extras = Bundle()
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
    mediaDescriptionBuilder.setExtras(extras)
    return MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE)
}

Java

import androidx.media.utils.MediaConstants;

private MediaBrowser.MediaItem createBrowsableMediaItem(
    String mediaId,
    String folderName,
    Uri iconUri) {
    MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
    mediaDescriptionBuilder.setMediaId(mediaId);
    mediaDescriptionBuilder.setTitle(folderName);
    mediaDescriptionBuilder.setIconUri(iconUri);
    Bundle extras = new Bundle();
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
    extras.putInt(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
        MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
    mediaDescriptionBuilder.setExtras(extras);
    return new MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE);
}

शीर्षक संकेतों का इस्तेमाल करके आइटम का समूह बनाएं

मिलते-जुलते मीडिया आइटम को एक साथ ग्रुप करने के लिए, हर आइटम के लिए संकेत का इस्तेमाल किया जाता है. हर मीडिया आइटम किसी ग्रुप को अपने MediaDescription में एक ऐसे एक्स्ट्रा बंडल का एलान करना होगा जो इसमें पासकोड के साथ मैपिंग शामिल है DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE और एक समान स्ट्रिंग मान है. इस स्ट्रिंग को स्थानीय भाषा में लिखें, जिसका इस्तेमाल समूह का शीर्षक.

नीचे दिया गया कोड स्निपेट, सबग्रुप के साथ MediaItem बनाने का तरीका बताता है "Songs" का हेडिंग:

Kotlin

import androidx.media.utils.MediaConstants

private fun createMediaItem(
    mediaId: String,
    folderName: String,
    iconUri: Uri
): MediaBrowser.MediaItem {
    val mediaDescriptionBuilder = MediaDescription.Builder()
    mediaDescriptionBuilder.setMediaId(mediaId)
    mediaDescriptionBuilder.setTitle(folderName)
    mediaDescriptionBuilder.setIconUri(iconUri)
    val extras = Bundle()
    extras.putString(
        MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
        "Songs")
    mediaDescriptionBuilder.setExtras(extras)
    return MediaBrowser.MediaItem(
        mediaDescriptionBuilder.build(), /* playable or browsable flag*/)
}

Java

import androidx.media.utils.MediaConstants;

private MediaBrowser.MediaItem createMediaItem(String mediaId, String folderName, Uri iconUri) {
   MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
   mediaDescriptionBuilder.setMediaId(mediaId);
   mediaDescriptionBuilder.setTitle(folderName);
   mediaDescriptionBuilder.setIconUri(iconUri);
   Bundle extras = new Bundle();
   extras.putString(
       MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
       "Songs");
   mediaDescriptionBuilder.setExtras(extras);
   return new MediaBrowser.MediaItem(
       mediaDescriptionBuilder.build(), /* playable or browsable flag*/);
}

आपके ऐप्लिकेशन को उन सभी मीडिया आइटम को पास करना ज़रूरी है जिन्हें आपको साथ-साथ ब्लॉक भी है. उदाहरण के लिए, मान लीजिए कि आपको दो ग्रुप दिखाने हैं मीडिया आइटम, "गाने" और "एल्बम" हैं, उसी क्रम में रहेगा और आपका ऐप्लिकेशन पांच मीडिया आइटम इस क्रम में हैं:

  1. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") के साथ मीडिया आइटम A
  2. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") वाला मीडिया आइटम B
  3. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") के साथ मीडिया आइटम C
  4. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") वाला मीडिया आइटम D
  5. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") के साथ मीडिया आइटम E

क्योंकि "गाने" के लिए मीडिया आइटम समूह और "एल्बम" ग्रुप नहीं रखा गया है आस-पास के ब्लॉक में एक साथ, Android Auto और Android Automotive OS इसे इन चार ग्रुप के तौर पर समझा जाता है:

  • ग्रुप 1 का नाम "गाने" है मीडिया आइटम A शामिल है
  • ग्रुप 2 का नाम "एल्बम" है मीडिया आइटम B शामिल है
  • ग्रुप 3 का नाम "गाने" है C और D मीडिया आइटम शामिल हैं
  • समूह 4 का नाम "एल्बम" है मीडिया आइटम E शामिल है

इन आइटम को दो ग्रुप में दिखाने के लिए, आपके ऐप्लिकेशन को इसके बजाय निम्न आदेश का अनुसरण कर रहा है:

  1. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") के साथ मीडिया आइटम A
  2. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") के साथ मीडिया आइटम C
  3. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") वाला मीडिया आइटम D
  4. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") वाला मीडिया आइटम B
  5. extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") के साथ मीडिया आइटम E

अतिरिक्त मेटाडेटा इंडिकेटर दिखाएं

एक नज़र में जानकारी देखने के लिए, अतिरिक्त मेटाडेटा इंडिकेटर शामिल किए जा सकते हैं मीडिया ब्राउज़र ट्री में और प्लेबैक के दौरान कॉन्टेंट की जानकारी. इस ब्राउज़ ट्री, Android Auto, और Android Automotive OS से जुड़ी अन्य जानकारी पढ़ें और कुछ स्थिरांक खोजें, ताकि यह पता चल सके कि इनसे डिसप्ले. मीडिया चलाने के दौरान, Android Auto और Android Automotive OS ने मीडिया सेशन का मेटाडेटा. साथ ही, तय करने के लिए कुछ कॉन्सटेंट खोजें इंडिकेटर.

तीसरी इमेज. गाने की पहचान करने वाले मेटाडेटा के साथ प्लेबैक व्यू चित्र भी शामिल है.

चौथी इमेज. इन पर नहीं चलाए गए वीडियो के लिए बिंदु के साथ व्यू ब्राउज़ करें पहला आइटम और स्क्रीन पर कुछ हद तक चल रहे कॉन्टेंट के लिए प्रोग्रेस बार दूसरा आइटम.

इन कॉन्सटेंट का इस्तेमाल दोनों MediaItem ब्यौरे में इस्तेमाल किया जा सकता है MediaMetadata अतिरिक्त:

  • EXTRA_DOWNLOAD_STATUS: किसी आइटम की डाउनलोड स्थिति के बारे में बताता है. इस कॉन्स्टेंट का इस्तेमाल इस तरह करें: कुंजी; निम्न लंबे स्थिरांक संभावित मान हैं:
    • STATUS_DOWNLOADED: आइटम पूरी तरह से डाउनलोड हो जाता है.
    • STATUS_DOWNLOADING: आइटम डाउनलोड किया जा रहा है.
    • STATUS_NOT_DOWNLOADED: आइटम डाउनलोड नहीं हुआ है.
  • METADATA_KEY_IS_EXPLICIT: बताता है कि आइटम में अश्लील सामग्री है या नहीं. यह बताने के लिए कि आइटम साफ़ तौर पर, इस कॉन्स्टेंट को कुंजी और लंबे METADATA_VALUE_ATTRIBUTE_PRESENT का इस्तेमाल करें.

इन कॉन्सटेंट का इस्तेमाल सिर्फ़ MediaItem ब्यौरे की अतिरिक्त चीज़ों में किया जा सकता है:

  • DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS: लंबी अवधि के वीडियो के पूरा होने की जानकारी देता है. जैसे, पॉडकास्ट एपिसोड या ऑडियो बुक. इस कॉन्स्टेंट को कुंजी के रूप में इस्तेमाल करें; नीचे दिया गया पूर्णांक कॉन्सटेंट की ये वैल्यू हो सकती हैं:
  • DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE: यह दिखाता है कि लंबी अवधि के वीडियो के पूरे हो जाने के बाद, 0.0 और 1.0 के बीच, दोनों भी शामिल हैं. यह अतिरिक्त जानकारी, PARTIALLY_PLAYING से पता चलता है कि Android Auto या Android पर Automotive OS की मदद से, प्रोग्रेस दिखाने वाला ज़्यादा बेहतर इंडिकेटर दिखता है. उदाहरण के लिए, प्रोग्रेस बार पर टैप करें. अगर आप इसका अतिरिक्त इस्तेमाल करते हैं, तो इससे जुड़ा सेक्शन देखें कॉन्टेंट चलने के दौरान, ब्राउज़ व्यू में प्रोग्रेस बार को अपडेट करना देखें कि इस इंडिकेटर को कैसे अप-टू-डेट रखा जाए. कोई इंप्रेशन नहीं होता.

जब उपयोगकर्ता मीडिया ब्राउज़ कर रहा हो, तब दिखने वाले इंंडिकेटर दिखाने के लिए ट्री, एक अतिरिक्त बंडल बनाएं जिसमें ये स्थिरांक हों और उस बंडल को MediaDescription.Builder.setExtras() तरीके से पास करना.

नीचे दिया गया कोड स्निपेट, अश्लील मीडिया के लिए इंडिकेटर दिखाने का तरीका बताता है वह आइटम जो 70% पूरा हो चुका है:

Kotlin

import androidx.media.utils.MediaConstants

val extras = Bundle()
extras.putLong(
    MediaConstants.METADATA_KEY_IS_EXPLICIT,
    MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
extras.putInt(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
    MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED)
extras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7)
val description =
    MediaDescriptionCompat.Builder()
        .setMediaId(/*...*/)
        .setTitle(resources.getString(/*...*/))
        .setExtras(extras)
        .build()
return MediaBrowserCompat.MediaItem(description, /* flags */)

Java

import androidx.media.utils.MediaConstants;

Bundle extras = new Bundle();
extras.putLong(
    MediaConstants.METADATA_KEY_IS_EXPLICIT,
    MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT);
extras.putInt(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
    MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
extras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7);
MediaDescriptionCompat description =
    new MediaDescriptionCompat.Builder()
        .setMediaId(/*...*/)
        .setTitle(resources.getString(/*...*/))
        .setExtras(extras)
        .build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);

अभी चल रहे मीडिया आइटम के लिए इंडिकेटर दिखाने के लिए, ये काम किए जा सकते हैं METADATA_KEY_IS_EXPLICIT या EXTRA_DOWNLOAD_STATUS के लिए Long वैल्यू का एलान करें आपके mediaSession के MediaMetadataCompat में. आप इसे नहीं दिखा सकते DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS या प्लेबैक व्यू पर DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE इंडिकेटर.

नीचे दिया गया कोड स्निपेट यह दिखाने का तरीका बताता है कि प्लेबैक व्यू में अश्लील कॉन्टेंट है और डाउनलोड किया गया है:

Kotlin

import androidx.media.utils.MediaConstants

mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
            albumArtUri.toString())
        .putLong(
            MediaConstants.METADATA_KEY_IS_EXPLICIT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        .putLong(
            MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
            MediaDescriptionCompat.STATUS_DOWNLOADED)
        .build())

Java

import androidx.media.utils.MediaConstants;

mediaSession.setMetadata(
    new MediaMetadataCompat.Builder()
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
        .putString(
            MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
            albumArtUri.toString())
        .putLong(
            MediaConstants.METADATA_KEY_IS_EXPLICIT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        .putLong(
            MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
            MediaDescriptionCompat.STATUS_DOWNLOADED)
        .build());

कॉन्टेंट चलने के दौरान, ब्राउज़ व्यू में प्रोग्रेस बार को अपडेट करें

जैसा कि हमने पहले बताया है, आपके पास DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE स्क्रीन पर कुछ समय तक चल रहे कॉन्टेंट के प्रोग्रेस बार को दिखाने के लिए अतिरिक्त ब्राउज़ व्यू. हालांकि, अगर कोई उपयोगकर्ता, पूरा कॉन्टेंट नहीं चला रहा है, तो Android Auto या Android Automotive OS का इस्तेमाल करते हैं, तो यह इंडिकेटर समय बीतने के साथ गलत होता है.

Android Auto और Android Automotive OS के लिए प्रोग्रेस बार को अप-टू-डेट रखने के लिए, मौजूदा कॉन्टेंट को इनसे जोड़ने के लिए, MediaMetadataCompat और PlaybackStateCompat मीडिया आइटम. आपके कैंपेन के लिए नीचे दी गई ज़रूरी शर्तें मीडिया आइटम में अपने-आप अपडेट होने वाला प्रोग्रेस बार हो:

नीचे दिया गया कोड स्निपेट यह बताता है कि अभी चल रहे आइटम के बारे में कैसे बताएं को ब्राउज़ व्यू में किसी आइटम से लिंक किया गया है:

Kotlin

import androidx.media.utils.MediaConstants

// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
val mediaItemExtras = Bundle()
mediaItemExtras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25)
val description =
    MediaDescriptionCompat.Builder()
        .setMediaId("my-media-id")
        .setExtras(mediaItemExtras)
        // ...and any other setters.
        .build()
return MediaBrowserCompat.MediaItem(description, /* flags */)

// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
        // ...and any other setters.
        .build())

val playbackStateExtras = Bundle()
playbackStateExtras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id")
mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setExtras(playbackStateExtras)
        // ...and any other setters.
        .build())

Java

import androidx.media.utils.MediaConstants;

// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
Bundle mediaItemExtras = new Bundle();
mediaItemExtras.putDouble(
    MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25);
MediaDescriptionCompat description =
    new MediaDescriptionCompat.Builder()
        .setMediaId("my-media-id")
        .setExtras(mediaItemExtras)
        // ...and any other setters.
        .build();
return MediaBrowserCompat.MediaItem(description, /* flags */);

// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
    new MediaMetadataCompat.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
        // ...and any other setters.
        .build());

Bundle playbackStateExtras = new Bundle();
playbackStateExtras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id");
mediaSession.setPlaybackState(
    new PlaybackStateCompat.Builder()
        .setExtras(playbackStateExtras)
        // ...and any other setters.
        .build());

पांचवी इमेज. “खोज के नतीजे” के विकल्प वाला प्लेबैक व्यू उपयोगकर्ता की वॉइस सर्च से जुड़ी मीडिया फ़ाइलें देखना.

आपका ऐप्लिकेशन, काम के खोज के ऐसे नतीजे दिखा सकता है जो लोगों को तब दिखते हैं, जब वे कोई खोज क्वेरी शुरू करते हैं. Android Auto और Android Automotive OS शो ये नतीजे, खोज क्वेरी इंटरफ़ेस या कीमत में बदलाव करके दिखाए जाते हैं सेशन में पहले की गई क्वेरी के लिए. ज़्यादा जानने के लिए, यह देखें इस गाइड में, बोलकर फ़ोन का इस्तेमाल करने की सुविधा सेक्शन देखें.

ब्राउज़ किए जा सकने वाले खोज के नतीजों को दिखाने के लिए, कॉन्स्टेंट बटन को शामिल करें BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED आपकी सेवा के onGetRoot() के अतिरिक्त बंडल में विधि, बूलियन true के लिए मैपिंग की गई है.

नीचे दिया गया कोड स्निपेट, onGetRoot() में सहायता पाने का तरीका बताता है तरीका:

Kotlin

import androidx.media.utils.MediaConstants

@Nullable
fun onGetRoot(
    @NonNull clientPackageName: String,
    clientUid: Int,
    @Nullable rootHints: Bundle
): BrowserRoot {
    val extras = Bundle()
    extras.putBoolean(
        MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true)
    return BrowserRoot(ROOT_ID, extras)
}

Java

import androidx.media.utils.MediaConstants;

@Nullable
@Override
public BrowserRoot onGetRoot(
    @NonNull String clientPackageName,
    int clientUid,
    @Nullable Bundle rootHints) {
    Bundle extras = new Bundle();
    extras.putBoolean(
        MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true);
    return new BrowserRoot(ROOT_ID, extras);
}

खोज के नतीजे दिखाने के लिए, onSearch() को बदलें पद्धति को अपनाएं. Android Auto और Android Automotive OS उपयोगकर्ता जब भी कोई खोज शुरू करे, तो उसके खोज शब्दों को इस तरीके पर फ़ॉरवर्ड करें क्वेरी इंटरफ़ेस या “खोज के नतीजे” की कीमत से जुड़ी जानकारी शामिल होती है.

खोज बार को व्यवस्थित किया जा सकता है टाइटल आइटम का इस्तेमाल करने वाली आपकी सेवा की onSearch() तरीके से मिले नतीजे ताकि उन्हें ज़्यादा ब्राउज़ किया जा सके. उदाहरण के लिए, अगर आपका ऐप्लिकेशन संगीत चलाता है, तो एल्बम, कलाकार, और गानों के हिसाब से खोज के नतीजों को व्यवस्थित किया जा सकता है.

नीचे दिया गया कोड स्निपेट, onSearch() को आसानी से लागू करने का तरीका दिखाता है तरीका:

Kotlin

fun onSearch(query: String, extras: Bundle) {
  // Detach from results to unblock the caller (if a search is expensive).
  result.detach()
  object:AsyncTask() {
    internal var searchResponse:ArrayList
    internal var succeeded = false
    protected fun doInBackground(vararg params:Void):Void {
      searchResponse = ArrayList()
      if (doSearch(query, extras, searchResponse))
      {
        succeeded = true
      }
      return null
    }
    protected fun onPostExecute(param:Void) {
      if (succeeded)
      {
        // Sending an empty List informs the caller that there were no results.
        result.sendResult(searchResponse)
      }
      else
      {
        // This invokes onError() on the search callback.
        result.sendResult(null)
      }
      return null
    }
  }.execute()
}
// Populates resultsToFill with search results. Returns true on success or false on error.
private fun doSearch(
    query: String,
    extras: Bundle,
    resultsToFill: ArrayList
): Boolean {
  // Implement this method.
}

Java

@Override
public void onSearch(final String query, final Bundle extras,
                        Result<List<MediaItem>> result) {

  // Detach from results to unblock the caller (if a search is expensive).
  result.detach();

  new AsyncTask<Void, Void, Void>() {
    List<MediaItem> searchResponse;
    boolean succeeded = false;
    @Override
    protected Void doInBackground(Void... params) {
      searchResponse = new ArrayList<MediaItem>();
      if (doSearch(query, extras, searchResponse)) {
        succeeded = true;
      }
      return null;
    }

    @Override
    protected void onPostExecute(Void param) {
      if (succeeded) {
       // Sending an empty List informs the caller that there were no results.
       result.sendResult(searchResponse);
      } else {
        // This invokes onError() on the search callback.
        result.sendResult(null);
      }
    }
  }.execute()
}

/** Populates resultsToFill with search results. Returns true on success or false on error. */
private boolean doSearch(String query, Bundle extras, ArrayList<MediaItem> resultsToFill) {
    // Implement this method.
}

पसंद के मुताबिक ब्राउज़ करने की कार्रवाइयां

पसंद के मुताबिक ब्राउज़ करने की एक कार्रवाई.

छठी इमेज. पसंद के मुताबिक ब्राउज़ करने की एक कार्रवाई

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

पसंद के मुताबिक ब्राउज़ करने की कार्रवाइयों का ओवरफ़्लो मेन्यू.

सातवीं इमेज. पसंद के मुताबिक ब्राउज़ करने की कार्रवाई का ओवरफ़्लो

अगर OEM की ओर से दिखाए जाने की अनुमति से ज़्यादा कस्टम कार्रवाइयां हैं, तो उपयोगकर्ता को ओवरफ़्लो मेन्यू दिखाया जाएगा.

वे कैसे काम करती हैं?

पसंद के मुताबिक ब्राउज़ करने की हर कार्रवाई इससे तय होती है:

  • ऐक्शन आईडी (यूनीक स्ट्रिंग आइडेंटिफ़ायर)
  • कार्रवाई का लेबल (उपयोगकर्ता को दिखाया जाने वाला टेक्स्ट)
  • ऐक्शन आइकॉन यूआरआई (ड्रॉ करने लायक वेक्टर, जिसे टिंट किया जा सकता है)

आपको कस्टम ब्राउज़िंग कार्रवाइयों की एक सूची दुनिया भर में मिलेगी BrowseRoot. इसके बाद, इन कार्रवाइयों का सबसेट अलग-अलग MediaItem. अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

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

ब्राउज़ नोड रूट में पसंद के मुताबिक ब्राउज़ कार्रवाइयां.

आठवीं इमेज. पसंद के मुताबिक ब्राउज़ करने की कार्रवाई का टूलबार

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

कस्टम ब्राउज़ करने की कार्रवाइयों को लागू करने का तरीका

अपने प्रोजेक्ट में कस्टम ब्राउज़ करने की कार्रवाइयां जोड़ने के लिए, यह तरीका अपनाएं:

  1. अपने MediaBrowserServiceCompat लागू करना:
  2. रनटाइम के दौरान कार्रवाई की सीमाओं को पार्स करें:
    • onGetRoot() में, हर कार्रवाई के लिए ज़्यादा से ज़्यादा संख्या में कार्रवाइयां करें कुंजी का इस्तेमाल करके MediaItem BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT rootHints Bundle में. 0 की सीमा का मतलब है कि सुविधा सिस्टम द्वारा समर्थित नहीं.
  3. कस्टम ब्राउज़ ऐक्शन की ग्लोबल सूची बनाएं:
    • हर कार्रवाई के लिए, इन कुंजियों के साथ Bundle ऑब्जेक्ट बनाएं: * EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID: कार्रवाई आईडी * EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL: कार्रवाई लेबल * EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI: कार्रवाई आइकॉन का यूआरआई * एक सूची में सभी कार्रवाई Bundle ऑब्जेक्ट जोड़ें.
  4. अपने BrowseRoot में ग्लोबल सूची जोड़ें:
  5. अपने MediaItem ऑब्जेक्ट में कार्रवाइयां जोड़ें:
    • अलग-अलग MediaItem ऑब्जेक्ट में कार्रवाइयां जोड़ी जा सकती हैं. इसके लिए, कुंजी का इस्तेमाल करके MediaDescriptionCompat एक्स्ट्रा में कार्रवाई आईडी की सूची DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST. यह सूची, उन कार्रवाइयों की ग्लोबल सूची का सबसेट होनी चाहिए जिनमें आपने बताया है BrowseRoot.
  6. कार्रवाइयों को मैनेज करना और नतीजे हासिल करने की प्रोग्रेस या नतीजों को मैनेज करना:
    • onCustomAction में, कार्रवाई आईडी और किसी अपनी ज़रूरत के हिसाब से कोई अन्य डेटा ऐक्सेस कर सकते हैं. आपको MediaItem का आईडी मिल सकता है, ने कुंजी का इस्तेमाल करके अतिरिक्त में से कार्रवाई को ट्रिगर किया EXTRAS_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID..
    • MediaItem के लिए कार्रवाइयों की सूची अपडेट की जा सकती है. इसके लिए, बटन EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM या नतीजे के बंडल में.

शुरू करने के लिए, BrowserServiceCompat में ये बदलाव किए जा सकते हैं के साथ ब्राउज़ करें.

BrowserServiceCompat को ओवरराइड करें

आपको MediaBrowserServiceCompat में इन तरीकों को बदलना होगा.

public void onLoadItem(String itemId, @NonNull Result<MediaBrowserCompat.MediaItem> result)

public void onCustomAction(@NonNull String action, Bundle extras, @NonNull Result<Bundle> result)

पार्स कार्रवाइयों की सीमा

आपको देखना चाहिए कि पसंद के मुताबिक कितनी कार्रवाइयां की जा सकती हैं.

public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, Bundle rootHints) {
    rootHints.getInt(
            MediaConstants.BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT, 0)
}

पसंद के मुताबिक ब्राउज़ करने की कार्रवाई बनाएं

हर कार्रवाई को एक अलग Bundle में पैक किया जाना चाहिए.

  • कार्रवाई आईडी
    bundle.putString(MediaConstants.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID,
                    "<ACTION_ID>")
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • कार्रवाई लेबल
    bundle.putString(MediaConstants.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL,
                    "<ACTION_LABEL>")
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • कार्रवाई आइकॉन यूआरआई
    bundle.putString(MediaConstants.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI,
                    "<ACTION_ICON_URI>")
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

Parceable ArrayList में कस्टम ब्राउज़ कार्रवाइयां जोड़ें

सभी पसंद के मुताबिक ब्राउज़ करने की कार्रवाई वाले Bundle ऑब्जेक्ट, ArrayList में जोड़ें.

private ArrayList<Bundle> createCustomActionsList(
                                        CustomBrowseAction browseActions) {
    ArrayList<Bundle> browseActionsBundle = new ArrayList<>();
    for (CustomBrowseAction browseAction : browseActions) {
        Bundle action = new Bundle();
        action.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID,
                browseAction.mId);
        action.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL,
                getString(browseAction.mLabelResId));
        action.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI,
                browseAction.mIcon);
        browseActionsBundle.add(action);
    }
    return browseActionsBundle;
}

ब्राउज़ रूट में पसंद के मुताबिक ब्राउज़ करने की कार्रवाई की सूची जोड़ें

public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid,
                             Bundle rootHints) {
    Bundle browserRootExtras = new Bundle();
    browserRootExtras.putParcelableArrayList(
            BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST,
            createCustomActionsList()));
    mRoot = new BrowserRoot(ROOT_ID, browserRootExtras);
    return mRoot;
}

MediaItem में कार्रवाइयां जोड़ें

MediaDescriptionCompat buildDescription (long id, String title, String subtitle,
                String description, Uri iconUri, Uri mediaUri,
                ArrayList<String> browseActionIds) {

    MediaDescriptionCompat.Builder bob = new MediaDescriptionCompat.Builder();
    bob.setMediaId(id);
    bob.setTitle(title);
    bob.setSubtitle(subtitle);
    bob.setDescription(description);
    bob.setIconUri(iconUri);
    bob.setMediaUri(mediaUri);

    Bundle extras = new Bundle();
    extras.putStringArrayList(
          DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST,
          browseActionIds);

    bob.setExtras(extras);
    return bob.build();
}
MediaItem mediaItem = new MediaItem(buildDescription(...), flags);

बिल्ड onCustomAction नतीजा

  • Bundle extras से MediaId को पार्स करें:
    @Override
    public void onCustomAction(
              @NonNull String action, Bundle extras, @NonNull Result<Bundle> result){
      String mediaId = extras.getString(MediaConstans.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID);
    }
    
  • एसिंक्रोनस नतीजों के लिए नतीजे अलग करें. result.detach() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • बिल्ड रिज़ल्ट बंडल
    • उपयोगकर्ता के लिए मैसेज
      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE,
                mContext.getString(stringRes))
      
      अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
    • आइटम अपडेट करें(किसी आइटम में कार्रवाइयां अपडेट करने के लिए उपयोग करें)
      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM, mediaId);
      
      अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
    • प्लेबैक व्यू खोलें
      //Shows user the PBV without changing the playback state
      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM, null);
      
      अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
    • ब्राउज़ नोड अपडेट करें
      //Change current browse node to mediaId
      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE, mediaId);
      
      अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  • अगर कोई गड़बड़ी हुई है, तो result.sendError(resultBundle). पर कॉल करें
  • अगर प्रोग्रेस अपडेट होती है, तो result.sendProgressUpdate(resultBundle) पर कॉल करें.
  • result.sendResult(resultBundle) पर कॉल करके प्रक्रिया पूरी करें.

कार्रवाई का स्टेटस अपडेट करें

यह तरीका, result.sendProgressUpdate(resultBundle) तरीका इस्तेमाल करके EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM कुंजी के साथ, आप कार्रवाई की नई स्थिति दिखाने के लिए MediaItem को अपडेट कर सकते हैं. यह आपको उपयोगकर्ता को इस बारे में रीयल-टाइम फ़ीडबैक देने की सुविधा मिलती है कि की कार्रवाई का नतीजा है.

उदाहरण: डाउनलोड कार्रवाई

यहां एक उदाहरण दिया गया है कि कैसे इस सुविधा का इस्तेमाल करके, डाउनलोड ऐक्शन लागू किया जा सकता है तीन स्थितियों के साथ:

  1. डाउनलोड: यह कार्रवाई की शुरुआती स्थिति है. जब उपयोगकर्ता यह चुनता है तो इसे "डाउनलोड किया जा रहा है" से बदला जा सकता है और कॉल करें यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए, sendProgressUpdate.
  2. डाउनलोड हो रहा है: इस स्थिति से पता चलता है कि डाउनलोड जारी है. आप इस स्थिति का इस्तेमाल, उपयोगकर्ता को प्रोग्रेस बार या कोई दूसरा इंडिकेटर दिखाने के लिए करें.
  3. डाउनलोड हो गया: इस स्थिति से पता चलता है कि डाउनलोड पूरा हो गया है. जब डाउनलोड समाप्त होता है, तो आप "डाउनलोड" "डाउनलोड किया गया" के साथ और कॉल करें sendResult EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM कुंजी का उपयोग करें. साथ ही, विज्ञापनों के लिए यह EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE सफलता का मैसेज दिखाने के लिए, इस पासकोड का इस्तेमाल करें.

इससे आपको डाउनलोड के बारे में उपयोगकर्ता को साफ़ तौर पर सुझाव, राय देने या शिकायत करने में मदद मिलती है प्रोसेस और उसकी मौजूदा स्थिति को समझाता है. आइकॉन की मदद से ज़्यादा जानकारी जोड़ी जा सकती है 25%, 50%, 75% डाउनलोड की स्थितियां.

उदाहरण: पसंदीदा कार्रवाई

दूसरा उदाहरण, दो स्थितियों वाली पसंदीदा कार्रवाई है:

  1. पसंदीदा: यह कार्रवाई उन आइटम के लिए दिखाई जाती है जो पसंदीदा के तौर पर मार्क करें. जब उपयोगकर्ता यह कार्रवाई चुनता है, तो आपके पास इसे बदलने का विकल्प होता है "पसंदीदा" के साथ और sendResult को EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM कुंजी का उपयोग करके यूज़र इंटरफ़ेस को अपडेट किया जा सकता है.
  2. पसंदीदा: यह कार्रवाई उन आइटम के लिए दिखाई जाती है जो उपयोगकर्ता के पसंदीदा वीडियो की सूची. जब उपयोगकर्ता यह कार्रवाई चुनता है, तो आप इसे इससे स्वैप कर सकते हैं "पसंदीदा" और sendResult को EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM कुंजी का उपयोग करके यूज़र इंटरफ़ेस को अपडेट किया जा सकता है.

यह तरीका उपयोगकर्ताओं को अपनी रुचि की जानकारी पसंदीदा आइटम.

इन उदाहरणों में बताया गया है कि पसंद के मुताबिक ब्राउज़ करने की सुविधा को कैसे इस्तेमाल किया जा सकता है. साथ ही, यह भी बताया गया है कि इन तरीकों से इससे आपको अलग-अलग सुविधाओं को लागू करने में मदद मिलती है. साथ ही, रीयल-टाइम में अपने फ़ीडबैक की मदद से कार के मीडिया ऐप्लिकेशन में एक बेहतर उपयोगकर्ता अनुभव मिलता है.

इस सुविधा को लागू करने का पूरा उदाहरण देखने के लिए, TestMediaApp प्रोजेक्ट.

प्लेबैक कंट्रोल चालू करें

Android Auto और Android Automotive OS, इसके ज़रिए प्लेबैक कंट्रोल के निर्देश भेजते हैं आपकी सेवा के MediaSessionCompat. आपको एक सेशन रजिस्टर करना होगा और उससे जुड़े कॉलबैक के तरीके लागू करने होंगे.

मीडिया सेशन रजिस्टर करना

आपकी मीडिया ब्राउज़र सेवा के onCreate() में तरीका चुनने के लिए, कोई MediaSessionCompat बनाएं, फिर setSessionToken() पर कॉल करके मीडिया सेशन रजिस्टर करें.

नीचे दिया गया कोड स्निपेट, मीडिया सेशन बनाने और रजिस्टर करने का तरीका बताता है:

Kotlin

override fun onCreate() {
    super.onCreate()
    ...
    // Start a new MediaSession.
    val session = MediaSessionCompat(this, "session tag").apply {
        // Set a callback object that implements MediaSession.Callback
        // to handle play control requests.
        setCallback(MyMediaSessionCallback())
    }
    sessionToken = session.sessionToken
    ...
}

Java

public void onCreate() {
    super.onCreate();
    ...
    // Start a new MediaSession.
    MediaSessionCompat session = new MediaSessionCompat(this, "session tag");
    setSessionToken(session.getSessionToken());

    // Set a callback object that implements MediaSession.Callback
    // to handle play control requests.
    session.setCallback(new MyMediaSessionCallback());
    ...
}

मीडिया सेशन ऑब्जेक्ट बनाते समय, इस्तेमाल किया जाने वाला कॉलबैक ऑब्जेक्ट सेट किया जाता है प्लेबैक कंट्रोल के अनुरोधों को हैंडल करने के लिए. आप यह कॉलबैक ऑब्जेक्ट इसके ज़रिए बनाते हैं MediaSessionCompat.Callback को लागू करने की सुविधा क्लास का नाम डालें. अगले सेक्शन में, इस ऑब्जेक्ट को लागू करने के तरीके के बारे में बताया गया है.

चलाने के निर्देश लागू करें

जब कोई उपयोगकर्ता आपके ऐप्लिकेशन के किसी मीडिया आइटम के लिए प्लेबैक का अनुरोध करता है, तो Android Automotive ओएस और Android Auto, MediaSessionCompat.Callback का इस्तेमाल करते हैं आपके ऐप्लिकेशन के MediaSessionCompat की मदद से क्लास आपके ऐप्लिकेशन की मीडिया ब्राउज़र सेवा से मिला ऑब्जेक्ट. जब कोई उपयोगकर्ता सामग्री प्लेबैक को नियंत्रित करना चाहता है, जैसे प्लेबैक रोकना या स्किप करना अगला ट्रैक, Android Auto और Android Automotive OS किसी एक कॉलबैक को शुरू करते हैं ऑब्जेक्ट के मेथड हैं.

कॉन्टेंट को चलाने के लिए, आपके ऐप्लिकेशन को ऐब्स्ट्रैक्ट MediaSessionCompat.Callback को बढ़ाना होगा क्लास में शामिल करें और उन तरीकों को लागू करें जो आपके ऐप्लिकेशन पर काम करते हैं.

कॉलबैक के उन सभी तरीकों को लागू करें जो उनके काम के हों आपके ऐप्लिकेशन में उपलब्ध कॉन्टेंट का टाइप:

onPrepare()
मीडिया सोर्स बदलने पर चालू होता है. Android Automotive OS की सेवा भी शुरू की गई इस तरीके से, Chromebook को बूट करने के तुरंत बाद लागू कर सकते हैं. आपके मीडिया ऐप्लिकेशन को यह लागू करना होगा तरीका.
onPlay()
यह नीति तब शुरू की जाती है, जब उपयोगकर्ता किसी खास आइटम को चुने बिना गेम खेलने का विकल्प चुनता है. आपका ऐप को अपना डिफ़ॉल्ट कॉन्टेंट चलाना होगा या अगर वीडियो को onPause(), आपके ऐप पर वीडियो फिर से शुरू हो जाता है.

ध्यान दें: आपके ऐप्लिकेशन पर संगीत अपने-आप चलने की सुविधा चालू नहीं होनी चाहिए जब Android Automotive OS या Android Auto को आपके मीडिया ब्राउज़र से कनेक्ट किया जाता है सेवा. ज़्यादा जानकारी के लिए, वीडियो चलाने की शुरुआती स्थिति सेट करते समय.

onPlayFromMediaId()
यह तब लागू होता है, जब उपयोगकर्ता कोई खास आइटम चुनता है. तरीका पास किया गया वह आईडी जिसे आपकी मीडिया ब्राउज़र सेवा ने असाइन किया है मीडिया आइटम को लिंक करें.
onPlayFromSearch()
यह नीति तब शुरू की जाती है, जब कोई उपयोगकर्ता खोज क्वेरी से वीडियो चलाने का विकल्प चुनता है. ऐप्लिकेशन को पास की गई खोज स्ट्रिंग के आधार पर एक सही विकल्प चुनें.
onPause()
यह तब शुरू होता है, जब उपयोगकर्ता वीडियो को रोकने का विकल्प चुनता है.
onSkipToNext()
यह तब लागू होता है, जब उपयोगकर्ता अगले आइटम पर जाता है.
onSkipToPrevious()
यह तब लागू होता है, जब उपयोगकर्ता पिछले आइटम पर जाने का विकल्प चुनता है.
onStop()
यह तब शुरू होता है, जब कोई व्यक्ति वीडियो चलाना बंद करने का विकल्प चुनता है.

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

कार के सिस्टम से कॉन्टेंट चलाने के लिए, आपके ऐप्लिकेशन को किसी खास तरीके की ज़रूरत नहीं है स्पीकर. जब आपके ऐप्लिकेशन को कॉन्टेंट चलाने का अनुरोध मिलता है, तब वह ऑडियो चला सकता है ठीक वैसे ही जैसे यह कॉन्टेंट को उपयोगकर्ता के फ़ोन के स्पीकर या हेडफ़ोन. Android Auto और Android Automotive OS ऑडियो कॉन्टेंट को अपने-आप कार के सिस्टम पर भेजा जाएगा, ताकि उसे चलाया जा सके कार के स्पीकर.

ऑडियो कॉन्टेंट चलाने के बारे में ज़्यादा जानने के लिए, यह देखें MediaPlayer की खास जानकारी, ऑडियो ऐप्लिकेशन की खास जानकारी, और ExoPlayer की खास जानकारी देखें.

वीडियो चलाने की मानक कार्रवाइयां सेट करें

Android Auto और Android Automotive OS के डिसप्ले प्लेबैक कंट्रोल, वे कार्रवाइयां जो PlaybackStateCompat में चालू हैं ऑब्जेक्ट है.

डिफ़ॉल्ट रूप से, आपके ऐप्लिकेशन में ये कार्रवाइयां की जा सकती हैं:

अगर ये कार्रवाइयां ज़रूरी हैं, तो आपके ऐप्लिकेशन पर ये कार्रवाइयां भी की जा सकती हैं ऐप्लिकेशन का कॉन्टेंट:

इसके अलावा, आपके पास चलाने की सूची बनाने का विकल्प भी है, जिसे उपयोगकर्ता से जुड़ा है, लेकिन इसकी ज़रूरत नहीं है. ऐसा करने के लिए, setQueue() पर कॉल करें और setQueueTitle() तरीकों का इस्तेमाल करके, ACTION_SKIP_TO_QUEUE_ITEM को चालू करें कार्रवाई करें और कॉलबैक onSkipToQueueItem() के बारे में बताएं.

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

Android Auto और Android Automotive OS वाली हर कार्रवाई के लिए डिसप्ले बटन और वीडियो सूची पर भी नज़र रख सकते हैं. जब बटन क्लिक करने पर सिस्टम, इनसे संबंधित कॉलबैक को शुरू करता है MediaSessionCompat.Callback.

इस्तेमाल नहीं किया गया स्टोरेज खाली करें

Android Auto और Android Automotive OS के यूज़र इंटरफ़ेस (यूआई) में यह जगह रिज़र्व है ACTION_SKIP_TO_PREVIOUS और ACTION_SKIP_TO_NEXT कार्रवाइयां. अगर आपका ऐप्लिकेशन इनमें से कोई भी फ़ंक्शन काम नहीं करता. Android Auto और Android Automotive OS का इस्तेमाल आपकी बनाई गई कस्टम कार्रवाइयां दिखाने के लिए स्पेस.

अगर आपको उन जगहों पर पसंद के मुताबिक कार्रवाइयां नहीं करनी हैं, तो आपके पास बुकिंग करने का विकल्प है ताकि Android Auto और Android Automotive OS जगह को खाली छोड़ दें जब आपका ऐप्लिकेशन इससे जुड़े फ़ंक्शन के साथ काम नहीं करता हो. ऐसा करने के लिए, कॉल करें setExtras() अतिरिक्त बंडल के साथ विधि जिसमें स्थिरांक हैं रिज़र्व किए गए फ़ंक्शन. SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT ACTION_SKIP_TO_NEXT से मेल खाता हो और SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV ACTION_SKIP_TO_PREVIOUS से मेल खाता हो. इन कॉन्स्टेंट को कुंजियों के तौर पर बंडल चुनें और उनकी वैल्यू के लिए बूलियन true का इस्तेमाल करें.

शुरुआती प्लेबैकस्टेट सेट करें

जब Android Auto और Android Automotive OS आपके मीडिया ब्राउज़र से कनेक्ट करते हैं सेवा, आपका मीडिया सत्र PlaybackStateCompat. Android Automotive OS होने पर, आपके ऐप्लिकेशन में संगीत अपने-आप चलने की सुविधा शुरू नहीं होनी चाहिए या Android Auto को अपनी मीडिया ब्राउज़र सेवा से कनेक्ट करें. इसके बजाय, Android का इस्तेमाल करें कार के हिसाब से, फिर से वीडियो चलाने या फिर से चलाने के लिए, Auto और Android Automotive OS स्थिति या उपयोगकर्ता की कार्रवाइयों के लिए किया जाता है.

ऐसा करने के लिए, शुरुआती PlaybackStateCompat को सेट करें आपके मीडिया सेशन का इतना समय STATE_STOPPED, STATE_PAUSED, STATE_NONE, या STATE_ERROR.

Android Auto और Android Automotive OS में मीडिया सेशन सिर्फ़ ड्राइव की कुल अवधि तक, ताकि उपयोगकर्ता इन सेशन को बार-बार शुरू और बंद कर सकें. यहां की यात्रा पर हूं इससे उपयोगकर्ताओं को अलग-अलग तरह की ड्राइव के दौरान बेहतर अनुभव मिलता है. साथ ही, उपयोगकर्ता की पिछली गतिविधियों पर नज़र रखें सत्र स्थिति, ताकि जब मीडिया ऐप्लिकेशन को फिर से शुरू करने का अनुरोध करते हैं, तो उपयोगकर्ता अपने-आप वहीं से शुरू कर सकता है जहाँ उसने छोड़ा था बंद है—उदाहरण के लिए, आखिरी बार चलाया गया मीडिया आइटम, PlaybackStateCompat, और क़ीमतें देखें.

कस्टम प्लेबैक कार्रवाइयां जोड़ें

वीडियो चलाने की आपकी पसंद के मुताबिक कार्रवाइयां जोड़ी जा सकती हैं. ऐसा करके, ये कार्रवाइयां की जा सकती हैं: मीडिया ऐप्लिकेशन काम करता है. अगर स्पेस (और रिज़र्व नहीं है) की अनुमति देता है, तो Android ट्रांसपोर्ट कंट्रोल के लिए कस्टम कार्रवाइयाँ. अगर ऐसा नहीं है, तो कस्टम ऐक्शन ओवरफ़्लो मेन्यू में दिखाएं. कस्टम ऐक्शन, क्रम में दिखते हैं उन्हें PlaybackStateCompat में जोड़ दिया जाता है.

कस्टम ऐक्शन का इस्तेमाल करें, ताकि व्यवहार को स्टैंडर्ड मोड से अलग रखा जा सके कार्रवाइयां. स्टैंडर्ड टेक्स्ट को बदलने या डुप्लीकेट वर्शन बनाने के लिए इनका इस्तेमाल न करें कार्रवाइयां.

addCustomAction() का इस्तेमाल करके, कस्टम ऐक्शन जोड़े जा सकते हैं PlaybackStateCompat.Builder में तरीका क्लास.

नीचे दिए गए कोड स्निपेट में, पसंद के मुताबिक “रेडियो चैनल शुरू करें” को जोड़ने का तरीका बताया गया है कार्रवाई:

Kotlin

stateBuilder.addCustomAction(
    PlaybackStateCompat.CustomAction.Builder(
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA,
        resources.getString(R.string.start_radio_from_media),
        startRadioFromMediaIcon
    ).run {
        setExtras(customActionExtras)
        build()
    }
)

Java

stateBuilder.addCustomAction(
    new PlaybackStateCompat.CustomAction.Builder(
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA,
        resources.getString(R.string.start_radio_from_media),
        startRadioFromMediaIcon)
    .setExtras(customActionExtras)
    .build());

इस तरीके की ज़्यादा जानकारी वाले उदाहरण के लिए, setCustomAction() देखें GitHub पर Universal Android Music Player सैंपल ऐप्लिकेशन में मिलेगा.

कस्टम ऐक्शन बनाने के बाद, मीडिया सेशन उस कार्रवाई का जवाब दे सकता है onCustomAction() को ओवरराइड करके तरीका.

यह कोड स्निपेट दिखाता है कि आपका ऐप्लिकेशन “रेडियो चैनल शुरू करें” कार्रवाई:

Kotlin

override fun onCustomAction(action: String, extras: Bundle?) {
    when(action) {
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA -> {
            ...
        }
    }
}

Java

@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
    if (CUSTOM_ACTION_START_RADIO_FROM_MEDIA.equals(action)) {
        ...
    }
}

इस तरीके की ज़्यादा जानकारी वाले उदाहरण के लिए, onCustomAction देखें GitHub पर Universal Android Music Player सैंपल ऐप्लिकेशन में मिलेगा.

कस्टम ऐक्शन के लिए आइकॉन

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

अगर कोई कस्टम कार्रवाई स्टेटफ़ुल है, तो वह प्लेबैक सेटिंग को चालू या बंद करें—अलग-अलग राज्यों के लिए अलग-अलग आइकॉन उपलब्ध कराएं, ताकि उपयोगकर्ताओं को वे कार्रवाई को चुनने पर बदलाव देख सकते हैं.

बंद की गई कार्रवाइयों के लिए, आइकॉन का कोई दूसरा स्टाइल उपलब्ध कराना

जब मौजूदा संदर्भ के लिए कोई कस्टम कार्रवाई उपलब्ध न हो, तो स्वैप करें कस्टम ऐक्शन का आइकॉन, जिसमें विकल्प का आइकॉन मौजूद है. इस आइकॉन से पता चलता है कि बंद है.

छठी इमेज. पसंद के मुताबिक बनाए गए खास ऐक्शन आइकॉन के सैंपल.

ऑडियो का फ़ॉर्मैट बताएं

यह बताने के लिए कि फ़िलहाल चल रहा मीडिया, एक खास ऑडियो फ़ॉर्मैट का इस्तेमाल करता है, आपके पास उन कारों में रेंडर होने वाले आइकॉन तय करने का विकल्प होता है जिनमें यह सुविधा काम करती है. आपने लोगों तक पहुंचाया मुफ़्त में को सेट कर सकता है KEY_CONTENT_FORMAT_TINTABLE_LARGE_ICON_URI और KEY_CONTENT_FORMAT_TINTABLE_SMALL_ICON_URI वर्तमान में चल रहे मीडिया आइटम के अतिरिक्त बंडल में (इसे पास किया गया है MediaSession.setMetadata()). दोनों को सेट करना न भूलें उनमें से कुछ को अलग-अलग लेआउट में फ़िट किया जा सकता है.

इसके अलावा, आप KEY_IMMERSIVE_AUDIO अतिरिक्त सेट कर सकते हैं कार के OEM को बताना चाहते हैं कि यह इमर्सिव ऑडियो है. इसलिए, उन्हें बहुत सावधान रहना चाहिए यह तय करते समय कि क्या ध्यान खींचने वाला कॉन्टेंट बनाना.

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

लिंक जोड़ने के लिए, KEY_SUBTITLE_LINK_MEDIA_ID मेटाडेटा (सबटाइटल से लिंक करने के लिए) या KEY_DESCRIPTION_LINK_MEDIA_ID (इससे लिंक करने के लिए ब्यौरा). विवरण के लिए, उनके संदर्भ दस्तावेज़ देखें मेटाडेटा फ़ील्ड.

बोलकर फ़ोन का इस्तेमाल करना

ड्राइवर को सुरक्षित तरीके से चलाने के लिए, आपके मीडिया ऐप्लिकेशन में बोलकर फ़ोन का इस्तेमाल करने की सुविधा होनी चाहिए और सुविधाजनक अनुभव जो ध्यान भटकाने वाली चीज़ों को कम करता है. उदाहरण के लिए, अगर आपका ऐप्लिकेशन एक मीडिया आइटम चलाया जा रहा है, तो उपयोगकर्ता कह सकता है “[song title]चलाओ" ताकि ऐप्लिकेशन को, कार की स्क्रीन पर देखे या छुए बिना कोई दूसरा गाना चलाने के लिए कहा जाए डिसप्ले. उपयोगकर्ता अपनी क्वेरी के लिए सही बटन पर क्लिक करके क्वेरी शुरू कर सकते हैं स्टीयरिंग व्हील या हॉटवर्ड "Ok Google" बोल रहे हैं.

जब Android Auto या Android Automotive OS किसी आवाज़ की पहचान करता है और उसे समझ लेता है वह कार्रवाई होती है, तो उस वॉयस ऐक्शन को ऐप के द्वारा वितरित किया जाता है onPlayFromSearch(). इस कॉलबैक को मिलने पर, ऐप्लिकेशन को query से मिलता-जुलता कॉन्टेंट मिलता है स्ट्रिंग डालें और प्लेबैक शुरू करें.

उपयोगकर्ता अपनी क्वेरी में शब्दों की अलग-अलग कैटगरी तय कर सकते हैं: शैली, कलाकार, एल्बम, गाने का नाम, रेडियो स्टेशन या प्लेलिस्ट वगैरह. इमारत बनाते समय और अपने ऐप्लिकेशन के लिए ज़रूरी सभी कैटगरी को शामिल करें. अगर Android Auto या Android Automotive OS को यह पता चलता है कि कोई क्वेरी कुछ खास कैटगरी के साथ लिंक करता है, तो यह extras पैरामीटर में अतिरिक्त जोड़ देता है. कॉन्टेंट बनाने निम्न अतिरिक्त भेजे जा सकते हैं:

खाली query स्ट्रिंग का इस्तेमाल करें, जिसे यहां से भेजा जा सकता है अगर उपयोगकर्ता खोज के लिए शब्द नहीं बताता है, तो Android Auto या Android Automotive OS. उदाहरण के लिए, अगर उपयोगकर्ता कहता है, "कोई संगीत चलाओ." इस स्थिति में, आपका ऐप्लिकेशन हाल ही में चलाया गया या नया सुझाया गया ट्रैक शुरू करना चुनें.

अगर खोज को तुरंत प्रोसेस नहीं किया जा सकता, तो onPlayFromSearch() में उसे ब्लॉक न करें. इसके बजाय, वीडियो चलाने की स्थिति को STATE_CONNECTING पर सेट करें और एक साथ काम नहीं करने वाली थ्रेड पर खोज करने की कोशिश करते हैं.

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

"play" के अतिरिक्त क्वेरी, Android Auto, और Android Automotive OS प्लेबैक को कंट्रोल करने के लिए, वॉइस क्वेरी को पहचानें, जैसे कि "संगीत रोकें" और "next गाना" और इन कमांड को सही मीडिया सेशन कॉलबैक से मैच करें, onPause() और onSkipToNext() जैसे.

बोलकर वीडियो चलाने की सुविधा को कैसे लागू किया जाए, इसके बारे में ज़्यादा जानकारी के लिए Google Assistant और मीडिया ऐप्लिकेशन देखें.

ध्यान भटकाने वाले सुरक्षा उपायों को लागू करना

क्योंकि Android का इस्तेमाल करते समय किसी व्यक्ति का फ़ोन अपनी कार के स्पीकर से कनेक्ट होता है ऑटोमोबाइल, ड्राइवर का ध्यान भटकने से रोकने के लिए आपको अतिरिक्त सावधानियां बरतनी होंगी.

कार में अलार्म बंद करें

Android Auto के मीडिया ऐप्लिकेशन को, कार के स्पीकर से ऑडियो नहीं चलाना चाहिए जब तक कि उपयोगकर्ता, 'चलाएं' बटन दबाकर वीडियो चलाना शुरू नहीं करता. आपके मीडिया ऐप्लिकेशन से, उपयोगकर्ता का शेड्यूल किया गया अलार्म भी चालू नहीं होना चाहिए कार के स्पीकर से संगीत चला रही हूँ.

इस ज़रूरी शर्त को पूरा करने के लिए, आपका ऐप्लिकेशन CarConnection का इस्तेमाल कर सकता है कोई ऑडियो चलाने से पहले एक सिग्नल के रूप में होता है. आपका ऐप्लिकेशन यह देख सकता है कि फ़ोन कार कनेक्शन के लिए LiveData को देखकर, कार की स्क्रीन प्रोजेक्ट करना टाइप और जांच की जा रही है कि यह इसके बराबर है या नहीं CONNECTION_TYPE_PROJECTION.

अगर व्यक्ति का फ़ोन प्रोजेक्ट हो रहा हो, तो अलार्म की सुविधा देने वाले मीडिया ऐप्लिकेशन को एक काम करना होगा को इन बातों का ध्यान रखना चाहिए:

  • अलार्म बंद करें.
  • STREAM_ALARM पर अलार्म बजाएं और अलार्म को बंद करने के लिए फ़ोन की स्क्रीन पर एक यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराएं.

मीडिया विज्ञापन मैनेज करना

डिफ़ॉल्ट रूप से, मीडिया मेटाडेटा में बदलाव होने पर Android Auto एक सूचना दिखाता है ऑडियो प्लेबैक सेशन के दौरान. जब कोई मीडिया ऐप्लिकेशन, संगीत चलाने के बजाय स्विच करता है विज्ञापन चलाने के लिए, अक्सर एक ही विज्ञापन को बार-बार उपयोगकर्ता को सूचना मिलती है. Android Auto को सूचना दिखाने से रोकने के लिए इस मामले में, आपको मीडिया मेटाडेटा कुंजी METADATA_KEY_IS_ADVERTISEMENT से METADATA_VALUE_ATTRIBUTE_PRESENT जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:

Kotlin

import androidx.media.utils.MediaConstants

override fun onPlayFromMediaId(mediaId: String, extras: Bundle?) {
    MediaMetadataCompat.Builder().apply {
        if (isAd(mediaId)) {
            putLong(
                MediaConstants.METADATA_KEY_IS_ADVERTISEMENT,
                MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
        }
        // ...add any other properties you normally would.
        mediaSession.setMetadata(build())
    }
}

Java

import androidx.media.utils.MediaConstants;

@Override
public void onPlayFromMediaId(String mediaId, Bundle extras) {
    MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
    if (isAd(mediaId)) {
        builder.putLong(
            MediaConstants.METADATA_KEY_IS_ADVERTISEMENT,
            MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT);
    }
    // ...add any other properties you normally would.
    mediaSession.setMetadata(builder.build());
}

सामान्य गड़बड़ियां ठीक करना

ऐप्लिकेशन में कोई गड़बड़ी होने पर, वीडियो चलाने की स्थिति को STATE_ERROR पर सेट करें और setErrorMessage() का इस्तेमाल करके गड़बड़ी का मैसेज दें तरीका. PlaybackStateCompat देखें गड़बड़ी के कोड की सूची देखें. गड़बड़ी के मैसेज, उपयोगकर्ता को दिखने चाहिए और उपयोगकर्ता की मौजूदा जानकारी के हिसाब से होने चाहिए स्थान-भाषा. इसके बाद, Android Auto और Android Automotive OS गड़बड़ी की जानकारी दिखा सकते हैं. उपयोगकर्ता को कोई मैसेज न मिले.

उदाहरण के लिए, अगर उपयोगकर्ता के मौजूदा क्षेत्र में कॉन्टेंट उपलब्ध नहीं है, तो ERROR_CODE_NOT_AVAILABLE_IN_REGION का इस्तेमाल करें गड़बड़ी का मैसेज सेट करते समय गड़बड़ी का मैसेज दिख सकता है.

Kotlin

mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR)
        .setErrorMessage(PlaybackStateCompat.ERROR_CODE_NOT_AVAILABLE_IN_REGION, getString(R.string.error_unsupported_region))
        // ...and any other setters.
        .build())

Java

mediaSession.setPlaybackState(
    new PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR)
        .setErrorMessage(PlaybackStateCompat.ERROR_CODE_NOT_AVAILABLE_IN_REGION, getString(R.string.error_unsupported_region))
        // ...and any other setters.
        .build());

गड़बड़ी की स्थितियों के बारे में ज़्यादा जानकारी के लिए, मीडिया सेशन का इस्तेमाल करना: स्थितियां देखें और गड़बड़ियां शामिल हैं.

अगर Android Auto का इस्तेमाल करने वाले किसी व्यक्ति को गड़बड़ी ठीक करने के लिए, आपका फ़ोन ऐप्लिकेशन खोलना हो, तो अपने मैसेज में उपयोगकर्ता को वह जानकारी दें. उदाहरण के लिए, आपकी गड़बड़ी मैसेज में "[your app name] में साइन इन करो" लिखा हो सकता है "कृपया साइन इन करें" का इस्तेमाल करें.

अन्य संसाधन