विज्ञापन के लिए ब्रेक
Android Sender 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)
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) { } }
// 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") } }
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) }
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) } } }
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
में कोई इमेज उपलब्ध नहीं है, तो यह वैल्यू null दिखाती है. आपका ऐप्लिकेशन, ImagePicker
का सबक्लास बना सकता है और लागू करने का कोई दूसरा तरीका देने के लिए, onPickImage(MediaMetadata, ImageHints)
के तरीके को बदल सकता है. इसके बाद, CastMediaOptions.Builder
के setImagePicker
तरीके से उस सबक्लास को चुन सकता है.
ImageHints
, ImagePicker
को इमेज के टाइप और साइज़ के बारे में संकेत देता है, ताकि यूज़र इंटरफ़ेस (यूआई) में इमेज को दिखाने के लिए उसे चुना जा सके.
कास्ट करने के लिए दिखने वाले डायलॉग को पसंद के मुताबिक बनाना
सेशन लाइफ़साइकल मैनेज करना
SessionManager
, सेशन के लाइफ़साइकल को मैनेज करने के लिए मुख्य प्लैटफ़ॉर्म है. SessionManager
, सेशन शुरू करने, फिर से शुरू करने, और खत्म करने के लिए, Android के MediaRouter
रास्ते के विकल्प की स्थिति में होने वाले बदलावों को सुनता है. कोई रास्ता चुनने पर, SessionManager
एक Session
ऑब्जेक्ट बनाएगा और उसे शुरू या फिर से शुरू करने की कोशिश करेगा. किसी रास्ते को अनचुना करने पर,
SessionManager
मौजूदा सेशन को खत्म कर देगा.
इसलिए, यह पक्का करने के लिए कि SessionManager
सेशन लाइफ़साइकल को सही तरीके से मैनेज करे, आपको यह पक्का करना होगा कि:
- जब कोई उपयोगकर्ता कोई डिवाइस चुनता है, तो रास्ते चुनने वाले डायलॉग बॉक्स में,
MediaRouter.selectRoute(MediaRouter.RouteInfo)
को कॉल करें. - जब उपयोगकर्ता कास्टिंग बंद कर देता है, तो रूट कंट्रोलर डायलॉग (कनेक्ट होने की स्थिति या कास्ट करने की स्थिति में से किसी एक में),
MediaRouter.unselect(int)
को कॉल करें.
कास्ट डायलॉग बनाने के तरीके के आधार पर, आपको कुछ और कार्रवाइयां भी करनी पड़ सकती हैं:
- अगर आपने
MediaRouteChooserDialog
औरMediaRouteControllerDialog
का इस्तेमाल करके कास्ट डायलॉग बनाए हैं, तो ये डायलॉगMediaRouter
में, रास्ते के विकल्प को अपने-आप अपडेट कर देंगे. इसलिए, आपको कुछ करने की ज़रूरत नहीं है. - अगर आपने
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
याCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
का इस्तेमाल करके, कास्ट बटन सेट अप किया है, तो डायलॉगMediaRouteChooserDialog
औरMediaRouteControllerDialog
का इस्तेमाल करके बनाए जाते हैं. इसलिए, आपको कुछ भी करने की ज़रूरत नहीं है. - अन्य मामलों में, आपको कस्टम कास्ट डायलॉग बनाने होंगे. इसलिए,
MediaRouter
में रास्ते के विकल्प की स्थिति अपडेट करने के लिए, ऊपर दिए गए निर्देशों का पालन करें.
डिवाइसों की स्थिति 'शून्य' है
अगर आपने पसंद के मुताबिक कास्ट डायलॉग बनाए हैं, तो आपके कस्टम MediaRouteChooserDialog
को डिवाइस न मिलने की स्थिति को सही तरीके से मैनेज करना चाहिए. डायलॉग में इंडिकेटर होने चाहिए, ताकि उपयोगकर्ताओं को यह पता चल सके कि आपका ऐप्लिकेशन अब भी डिवाइसों को ढूंढ रहा है या नहीं.
अगर डिफ़ॉल्ट MediaRouteChooserDialog
का इस्तेमाल किया जा रहा है, तो डिवाइसों की संख्या शून्य होने की स्थिति को पहले से ही मैनेज किया जा चुका है.
अगले चरण
Android Sender ऐप्लिकेशन में जोड़ी जा सकने वाली सुविधाओं के बारे में यहां बताया गया है. अब किसी दूसरे प्लैटफ़ॉर्म (iOS या वेब) के लिए Sender ऐप्लिकेशन बनाया जा सकता है. इसके अलावा, वेब पर काम करने वाला Receiver ऐप्लिकेशन भी बनाया जा सकता है.