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

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

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

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

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

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

कोटलिन
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" />
कोटलिन
// 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) {
    }
}
Java
// 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 इंटरफ़ेस की मदद से लागू किया गया है:

कोटलिन
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 तरीके का इस्तेमाल करके कस्टम चैनल बनाया जा सकता है:

कोटलिन
try {
    mCastSession.setMessageReceivedCallbacks(
        mHelloWorldChannel.namespace,
        mHelloWorldChannel)
} catch (e: IOException) {
    Log.e(TAG, "Exception while creating channel", e)
}
Java
try {
    mCastSession.setMessageReceivedCallbacks(
            mHelloWorldChannel.getNamespace(),
            mHelloWorldChannel);
} catch (IOException e) {
    Log.e(TAG, "Exception while creating channel", e);
}

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

कोटलिन
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)
        }
    }
}
Java
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 विजेट के लिए इमेज चुनने की सेटिंग को बदलें

अगर कॉन्फ़िगर किया गया हो, तो फ़्रेमवर्क के अलग-अलग कॉम्पोनेंट (जैसे, कास्ट डायलॉग, मिनी कंट्रोलर, और यूज़र इंटरफ़ेस (यूआई) कंट्रोलर) फ़िलहाल कास्ट किए जा रहे मीडिया का आर्टवर्क दिखाएंगे. आम तौर पर, मीडिया के लिए इमेज आर्टवर्क के यूआरएल, 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 सेंडर ऐप्लिकेशन में जोड़ा जा सकता है. अब सेंडर का ऐप्लिकेशन किसी दूसरे प्लैटफ़ॉर्म (iOS या वेब) के लिए बनाया जा सकता है या वेब रिसीवर ऐप्लिकेशन बनाया जा सकता है.