अपने Android ऐप्लिकेशन में बेहतर सुविधाएं जोड़ना

विज्ञापन के लिए ब्रेक

Android सेंडर SDK टूल की मदद से, विज्ञापन के लिए ब्रेक और साथी विज्ञापनों के लिए दिया जाता है.

विज्ञापन के ब्रेक के काम करने के तरीके के बारे में ज़्यादा जानकारी के लिए, वेब रिसीवर के विज्ञापन के ब्रेक की खास जानकारी देखें.

भेजने और पाने वाले, दोनों के लिए ब्रेक तय किए जा सकते हैं. हालांकि, हमारा सुझाव है कि इन्हें वेब पाने वाले पर दी गई हो और Android TV रिसीवर को एक ही तरह से बनाए रखने के लिए अलग-अलग प्लैटफ़ॉर्म पर व्यवहार करते हैं.

Android पर, AdBreakClipInfo और AdBreakInfo का इस्तेमाल करके, लोड कमांड में विज्ञापन के लिए ब्रेक की जानकारी दें:

Kotlin
val breakClip1: AdBreakClipInfo =
    AdBreakClipInfo.Builder("bc0")
        .setTitle("Clip title")
        .setPosterUrl("https://www.some.url")
        .setDuration(60000)
        .setWhenSkippableInMs(5000)  // Set this field so that the ad is skippable
        .build()

val breakClip2: AdBreakClipInfo = 
val breakClip3: AdBreakClipInfo = 

val break1: AdBreakClipInfo =
    AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000)
        .setId("b0")
        .setBreakClipIds({"bc0","bc1","bc2"})
        
        .build()

val mediaInfo: MediaInfo = MediaInfo.Builder()
    
    .setAdBreaks({break1})
    .setAdBreakClips({breakClip1, breakClip2, breakClip3})
    .build()

val mediaLoadRequestData: MediaLoadRequestData = MediaInfo.Builder()
    
    .setMediaInfo(mediaInfo)
    .build()

remoteMediaClient.load(mediaLoadRequestData)
Java
AdBreakClipInfo breakClip1 =
    new AdBreakClipInfo.Builder("bc0")
        .setTitle("Clip title")
        .setPosterUrl("https://www.some.url")
        .setDuration(60000)
        .setWhenSkippableInMs(5000)  // Set this field so that the ad is skippable
        .build();

AdBreakClipInfo breakClip2 = 
AdBreakClipInfo breakClip3 = 

AdBreakInfo break1 =
    new AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000)
        .setId("b0")
        .setBreakClipIds({"bc0","bc1","bc2"})
        
        .build();

MediaInfo mediaInfo = new MediaInfo.Builder()
    
    .setAdBreaks({break1})
    .setAdBreakClips({breakClip1, breakClip2, breakClip3})
    .build();

MediaLoadRequestData mediaLoadRequestData = new MediaInfo.Builder()
    
    .setMediaInfo(mediaInfo)
    .build();

remoteMediaClient.load(mediaLoadRequestData);

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

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

// In AndroidManifest.xml
<receiver android:name="com.example.MyMediaIntentReceiver" />
Kotlin
// In your OptionsProvider
var mediaOptions = CastMediaOptions.Builder()
    .setMediaIntentReceiverClassName(MyMediaIntentReceiver::class.java.name)
    .build()

// Implementation of MyMediaIntentReceiver
internal class MyMediaIntentReceiver : MediaIntentReceiver() {
    override fun onReceiveActionTogglePlayback(currentSession: Session) {
    }

    override fun onReceiveActionMediaButton(currentSession: Session, intent: Intent) {
    }

    override fun onReceiveOtherAction(context: Context?, action: String, intent: Intent) {
    }
}
जावा
// In your OptionsProvider
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
        .setMediaIntentReceiverClassName(MyMediaIntentReceiver.class.getName())
        .build();

// Implementation of MyMediaIntentReceiver
class MyMediaIntentReceiver extends MediaIntentReceiver {
    @Override
    protected void onReceiveActionTogglePlayback(Session currentSession) {
    }

    @Override
    protected void onReceiveActionMediaButton(Session currentSession, Intent intent) {
    }

    @Override
    protected void onReceiveOtherAction(Context context, String action, Intent intent) {
    }
}

कोई कस्टम चैनल जोड़ें

भेजने वाले ऐप्लिकेशन को रिसीवर ऐप्लिकेशन से कनेक्ट करने के लिए, ऐप्लिकेशन को कस्टम चैनल बनाएं. मैसेज भेजने वाला व्यक्ति, स्ट्रिंग भेजने के लिए कस्टम चैनल का इस्तेमाल कर सकता है पाने वाले को मैसेज मिलते हैं. हर कस्टम चैनल को एक खास नेमस्पेस और प्रीफ़िक्स urn:x-cast: से शुरू होना चाहिए. उदाहरण के लिए, urn:x-cast:com.example.custom. कस्टम पैरामीटर के लिए कई कस्टम अलग-अलग नाम स्थान वाले चैनल. पाने वाला ऐप्लिकेशन ये काम भी कर सकता है: मैसेज भेजना और पाना का इस्तेमाल करें.

कस्टम चैनल को Cast.MessageReceivedCallback इंटरफ़ेस:

Kotlin
class HelloWorldChannel : MessageReceivedCallback {
    val namespace: String
        get() = "urn:x-cast:com.example.custom"

    override fun onMessageReceived(castDevice: CastDevice, namespace: String, message: String) {
        Log.d(TAG, "onMessageReceived: $message")
    }
}
Java
class HelloWorldChannel implements Cast.MessageReceivedCallback {
    public String getNamespace() {
        return "urn:x-cast:com.example.custom";
    }
    @Override
    public void onMessageReceived(CastDevice castDevice, String namespace, String message) {
        Log.d(TAG, "onMessageReceived: " + message);
    }
}

भेजने वाले ऐप्लिकेशन को पाने वाले ऐप्लिकेशन से कनेक्ट करने के बाद, कस्टम चैनल ये काम कर सकता है: का इस्तेमाल करके बनाए जा सकते हैं setMessageReceivedCallbacks तरीका:

Kotlin
try {
    mCastSession.setMessageReceivedCallbacks(
        mHelloWorldChannel.namespace,
        mHelloWorldChannel)
} catch (e: IOException) {
    Log.e(TAG, "Exception while creating channel", e)
}
जावा
try {
    mCastSession.setMessageReceivedCallbacks(
            mHelloWorldChannel.getNamespace(),
            mHelloWorldChannel);
} catch (IOException e) {
    Log.e(TAG, "Exception while creating channel", e);
}

कस्टम चैनल बन जाने के बाद, भेजने वाला व्यक्ति इसका इस्तेमाल कर सकता है: sendMessage पाने वाले को उस चैनल पर स्ट्रिंग मैसेज भेजने का तरीका:

Kotlin
private fun sendMessage(message: String) {
    if (mHelloWorldChannel != null) {
        try {
            mCastSession.sendMessage(mHelloWorldChannel.namespace, message)
                .setResultCallback { status ->
                    if (!status.isSuccess) {
                        Log.e(TAG, "Sending message failed")
                    }
                }
        } catch (e: Exception) {
            Log.e(TAG, "Exception while sending message", e)
        }
    }
}
जावा
private void sendMessage(String message) {
    if (mHelloWorldChannel != null) {
        try {
            mCastSession.sendMessage(mHelloWorldChannel.getNamespace(), message)
                .setResultCallback( status -> {
                    if (!status.isSuccess()) {
                        Log.e(TAG, "Sending message failed");
                    }
                });
        } catch (Exception e) {
            Log.e(TAG, "Exception while sending message", e);
        }
    }
}

अपने-आप चलने की सुविधा

वीडियो के नीचे अपने-आप चलाएं और एपीआई की सूची बनाना.

UX विजेट के लिए, इमेज चुनने की सेटिंग बदलें

फ़्रेमवर्क के अलग-अलग कॉम्पोनेंट, जैसे कि कास्ट डायलॉग, मिनी कंट्रोलर, और UIMediaController (अगर कॉन्फ़िगर किया गया हो) कास्ट किए जा रहे मीडिया का आर्टवर्क दिखाएंगे. आम तौर पर, इमेज आर्टवर्क के यूआरएल मीडिया के लिए MediaMetadata में शामिल है, लेकिन भेजने वाले के ऐप्लिकेशन में यूआरएल के वैकल्पिक स्रोत की जानकारी दें.

ImagePicker क्लास, MediaMetadata में मौजूद इमेज की सूची से सही इमेज चुनने का तरीका तय करती है. यह तरीका, इमेज के इस्तेमाल के आधार पर तय होता है. उदाहरण के लिए, सूचना का थंबनेल या फ़ुल स्क्रीन बैकग्राउंड. ImagePicker का डिफ़ॉल्ट रूप से लागू होना हमेशा पहली इमेज चुनता है, या अगर इमेज उपलब्ध नहीं होती, तो शून्य दिखाता है MediaMetadata. आपका ऐप्लिकेशन, ImagePicker का सबक्लास बना सकता है और लागू करने का कोई दूसरा तरीका देने के लिए, onPickImage(MediaMetadata, ImageHints) के तरीके को बदल सकता है. इसके बाद, CastMediaOptions.Builder के setImagePicker तरीके से उस सबक्लास को चुन सकता है. ImageHints किसी इमेज के टाइप और साइज़ के बारे में, ImagePicker को संकेत देता है यूज़र इंटरफ़ेस (यूआई) में दिखाने के लिए चुना गया.

कास्ट डायलॉग को पसंद के मुताबिक बनाना

सेशन की लाइफ़साइकल मैनेज करना

SessionManager सेशन की लाइफ़साइकल को मैनेज करने की मुख्य जगह है. SessionManager ने सुना Android पर MediaRouter सेशन को शुरू, फिर से शुरू, और खत्म करने के लिए, रूट चुनने की स्थिति में बदलाव किया जाता है. जब कोई रास्ता चुना गया है, SessionManager कोई Session ऑब्जेक्ट को पुनः शुरू करने या उसे फिर से शुरू करने का प्रयास करता है. किसी रास्ते से चुने हुए का निशान हटाने पर, SessionManager मौजूदा सेशन को खत्म कर देगा.

इसलिए, यह पक्का करने के लिए कि SessionManager, सेशन के लाइफ़साइकल को सही तरीके से मैनेज करे, इसके लिए कृपया यह पक्का करें कि:

कास्ट डायलॉग बनाने के तरीके के हिसाब से, आपको कुछ और कार्रवाइयां भी करनी पड़ सकती हैं:

  • यदि आप इसका उपयोग करके कास्ट करें संवाद बनाते हैं MediaRouteChooserDialog और MediaRouteControllerDialog तो ये डायलॉग अपने-आप MediaRouter में रास्ता चुनाव को अपडेट कर देंगे, इसलिए, आपको कुछ करने की ज़रूरत नहीं है.
  • अगर आपने CastButtonFactory.setUpMediaRouteButton(Context, Menu, int) या CastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton) का इस्तेमाल करके, कास्ट बटन को सेट अप किया है, तो डायलॉग असल में MediaRouteChooserDialog और MediaRouteControllerDialog का इस्तेमाल करके बनाए जाते हैं. इसलिए, आपको कुछ भी करने की ज़रूरत नहीं है.
  • अन्य मामलों में, आपको पसंद के मुताबिक कास्ट डायलॉग बनाने होंगे, इसलिए आपको रास्ता चुनने की स्थिति अपडेट करने के लिए, ऊपर दिए गए निर्देशों का पालन करें MediaRouter.

ज़ीरो डिवाइस की स्थिति

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

अगर डिफ़ॉल्ट MediaRouteChooserDialog का इस्तेमाल किया जा रहा है, तो डिवाइसों की संख्या शून्य होने की स्थिति को पहले से ही मैनेज किया जा चुका है.

अगले चरण

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