CCL প্রেরক অ্যাপটিকে কাস্ট অ্যাপ্লিকেশন ফ্রেমওয়ার্ক (CAF) এ স্থানান্তর করুন

নিম্নলিখিত পদ্ধতি আপনাকে আপনার Android প্রেরক অ্যাপটিকে CCL-এর সাথে Cast SDK v2 থেকে CAF-তে রূপান্তর করতে সক্ষম করে৷ CCL-এর সমস্ত কার্যকারিতা CAF-তে প্রয়োগ করা হয়েছে, তাই আপনি একবার স্থানান্তরিত হলে, আপনাকে আর CCL ব্যবহার করতে হবে না।

Cast CAF প্রেরক SDK আপনার হয়ে GoogleAPIClient পরিচালনা করতে CastContext ব্যবহার করে৷ CastContext আপনার জন্য লাইফসাইকেল, ত্রুটি এবং কলব্যাকগুলি পরিচালনা করে, যা একটি কাস্ট অ্যাপ বিকাশকে ব্যাপকভাবে সহজ করে।

ভূমিকা

  • যেহেতু CAF প্রেরকের নকশা কাস্ট কম্প্যানিয়ন লাইব্রেরি দ্বারা প্রভাবিত হয়েছিল, তাই CCL থেকে CAF প্রেরকের স্থানান্তরের মধ্যে বেশিরভাগই ক্লাস এবং তাদের পদ্ধতিগুলির এক থেকে এক ম্যাপিং জড়িত।
  • CAF প্রেরক এখনও Android SDK ম্যানেজার ব্যবহার করে Google Play পরিষেবার অংশ হিসাবে বিতরণ করা হয়৷
  • নতুন প্যাকেজ ( com.google.android.gms.cast.framework.* ) যেগুলি CAF প্রেরকের সাথে যোগ করা হয়েছে, CCL এর মতো কার্যকারিতা সহ, Google Cast ডিজাইন চেকলিস্ট মেনে চলার দায়িত্ব নেয়৷
  • CAF প্রেরক উইজেট প্রদান করে যা Cast UX প্রয়োজনীয়তা মেনে চলে; এই উইজেটগুলি সিসিএল দ্বারা প্রদত্ত উইজেটগুলির অনুরূপ।
  • CAF প্রেরক অ্যাসিঙ্ক্রোনাস কলব্যাকগুলি সরবরাহ করে যা CCL-এর মতো, রাজ্যগুলি ট্র্যাক করতে এবং ডেটা প্রাপ্ত করতে। CCL এর বিপরীতে, CAF প্রেরক বিভিন্ন ইন্টারফেস পদ্ধতির কোনো নো-অপ ইমপ্লিমেন্টেশন প্রদান করে না।

নিম্নলিখিত বিভাগগুলিতে, আমরা প্রধানত CCL-এর VideoCastManager-এর উপর ভিত্তি করে ভিডিওকেন্দ্রিক অ্যাপ্লিকেশনগুলিতে ফোকাস করব, তবে অনেক ক্ষেত্রে, একই ধারণাগুলি DataCastManager-এর ক্ষেত্রেও প্রযোজ্য।

নির্ভরতা

AppCompat সমর্থন লাইব্রেরি, MediaRouter v7 সমর্থন লাইব্রেরি এবং Google Play পরিষেবাগুলিতে CCL এবং CAF-এর একই নির্ভরতা রয়েছে৷ যাইহোক, পার্থক্য হল CAF নতুন কাস্ট ফ্রেমওয়ার্কের উপর নির্ভর করে যা Google Play পরিষেবা 9.2.0 বা তার পরে উপলব্ধ।

আপনার build.gradle ফাইলে, com.google.android.gms:play-services-cast এবং com.google.android.libraries.cast.companionlibrary:ccl এর উপর নির্ভরতা সরিয়ে দিন, তারপর নতুন কাস্ট ফ্রেমওয়ার্ক যোগ করুন:

dependencies {
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:mediarouter-v7:23.4.0'
    compile 'com.google.android.gms:play-services-cast-framework:9.4.0'
}

আপনি Google Play পরিষেবার মেটাডেটাও সরাতে পারেন:

<meta‐data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>

CAF-এর অংশ এমন যেকোন পরিষেবা, কার্যকলাপ এবং সংস্থানগুলি স্বয়ংক্রিয়ভাবে আপনার অ্যাপের ম্যানিফেস্ট এবং সংস্থানগুলির সাথে একত্রিত হয়৷

ন্যূনতম Android SDK সংস্করণ যা CAF সমর্থন করে তা হল 9 (জিঞ্জারব্রেড); CCL এর সর্বনিম্ন Android SDK সংস্করণ 10।

সিসিএল একটি সুবিধার পদ্ধতি প্রদান করে, BaseCastManager.checkGooglePlayServices(activity) , ডিভাইসটিতে Google Play পরিষেবাগুলির একটি সামঞ্জস্যপূর্ণ সংস্করণ উপলব্ধ রয়েছে কিনা তা যাচাই করতে৷ Cast SDK-এর অংশ হিসেবে CAF এটি প্রদান করে না। ব্যবহারকারীর ডিভাইসে সঠিক Google Play পরিষেবা APK ইনস্টল করা হয়েছে তা নিশ্চিত করতে ডিভাইসগুলিতে Google Play পরিষেবার APK আছে তা নিশ্চিত করুন কারণ আপডেটগুলি অবিলম্বে সমস্ত ব্যবহারকারীর কাছে নাও পৌঁছতে পারে৷

আপনাকে এখনও অ্যাপ্লিকেশনটির থিমের জন্য Theme.AppCompat-এর একটি বৈকল্পিক ব্যবহার করতে হবে৷

আরম্ভ

CCL-এর জন্য, VideoCastManager.initialize() কে অ্যাপ্লিকেশন ইনস্ট্যান্সের onCreate() পদ্ধতিতে কল করতে হবে। এই যুক্তিটি আপনার অ্যাপ্লিকেশন ক্লাস কোড থেকে সরানো উচিত।

CAF-তে, কাস্ট ফ্রেমওয়ার্কের জন্য একটি সুস্পষ্ট প্রাথমিক পদক্ষেপেরও প্রয়োজন। এর মধ্যে CastContext শুরু করা জড়িত, রিসিভার অ্যাপ্লিকেশন আইডি এবং অন্য যেকোনো বৈশ্বিক বিকল্প নির্দিষ্ট করার জন্য একটি উপযুক্ত OptionsProvider ব্যবহার করে। CastContext ক্লায়েন্টদের সাথে ইন্টারঅ্যাক্ট করে এমন একটি সিঙ্গেলটন প্রদান করে CCL এর VideoCastManager এর অনুরূপ ভূমিকা পালন করে। OptionsProvider হল CCL-এর CastConfiguration এর মতো যা আপনাকে কাস্ট ফ্রেমওয়ার্ক বৈশিষ্ট্যগুলি কনফিগার করার অনুমতি দেয়৷

যদি আপনার বর্তমান CCL CastConfiguration.Builder দেখতে এরকম হয়:

VideoCastManager.initialize(
   getApplicationContext(),
   new CastConfiguration.Builder(context.getString(R.string.app_id))
       .enableWifiReconnection()
       .enableAutoReconnect()
       .build());

তারপর CastOptions.Builder তে CastOptions.Builder ব্যবহার করে নিম্নলিখিত CastOptionsProvider একই রকম হবে:

public class CastOptionsProvider implements OptionsProvider {

    @Override
    public CastOptions getCastOptions(Context context) {
        return new CastOptions.Builder()
                .setReceiverApplicationId(context.getString(R.string.app_id))
                .build();
    }

    @Override
    public List<SessionProvider> getAdditionalSessionProviders(
            Context context) {
        return null;
    }
}

OptionsProvider-এর সম্পূর্ণ বাস্তবায়নের জন্য আমাদের নমুনা অ্যাপটি দেখুন।

AndroidManifest.xml ফাইলের "অ্যাপ্লিকেশন" উপাদানের মধ্যে OptionsProvider ঘোষণা করুন:

<application>
...
    <meta-data
        android:name=
          "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider"    
    />
</application>

অলসভাবে প্রতিটি Activity onCreate পদ্ধতিতে CastContext শুরু করুন (এবং Application উদাহরণ নয়):

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

CastContext অ্যাক্সেস করতে ব্যবহার করুন:

mCastContext = CastContext.getSharedInstance(this);

ডিভাইস আবিষ্কার

CCL এর VideoCastManager incrementUiCounter এবং decrementUiCounter আপনার Activities onResume এবং onPause পদ্ধতিগুলি থেকে সরানো উচিত৷

CAF-তে, আবিষ্কার প্রক্রিয়াটি ফ্রেমওয়ার্ক দ্বারা স্বয়ংক্রিয়ভাবে শুরু হয় এবং বন্ধ হয়ে যায় যখন অ্যাপটি ফোরগ্রাউন্ডে আসে এবং যথাক্রমে ব্যাকগ্রাউন্ডে যায়।

কাস্ট বোতাম এবং কাস্ট ডায়ালগ

সিসিএল-এর মতো, এই উপাদানগুলি MediaRouter v7 সমর্থন লাইব্রেরি দ্বারা সরবরাহ করা হয়।

কাস্ট বোতামটি এখনও MediaRouteButton দ্বারা প্রয়োগ করা হয়েছে এবং আপনার মেনুতে একটি মেনু আইটেম হিসাবে আপনার কার্যকলাপে (একটি ActionBar বা একটি Toolbar ব্যবহার করে) যোগ করা যেতে পারে৷

xml মেনুতে MediaRouteActionProvider এর ঘোষণা CCL-এর মতই:

<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
    app:showAsAction="always"/>

CCL-এর মতো, প্রতিটি কার্যকলাপের onCreateOptionMenu() পদ্ধতিকে ওভাররাইড করুন, কিন্তু CastManager.addMediaRouterButton ব্যবহার করার পরিবর্তে, মিডিয়ারুট বোতামকে কাস্ট ফ্রেমওয়ার্কে ওয়্যার আপ করতে CAF-এর CastButtonFactory ব্যবহার করুন:

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
                                                menu,
                                                R.id.media_route_menu_item);
    return true;
}

ডিভাইস নিয়ন্ত্রণ

CCL-এর মতো, CAF-তে, ডিভাইস নিয়ন্ত্রণ মূলত ফ্রেমওয়ার্ক দ্বারা পরিচালিত হয়। প্রেরক অ্যাপ্লিকেশনটিকে ডিভাইসের সাথে সংযোগ করা এবং GoogleApiClient ব্যবহার করে রিসিভার অ্যাপ্লিকেশন চালু করার (এবং পরিচালনা করার চেষ্টা করা উচিত নয়) পরিচালনা করার প্রয়োজন নেই।

প্রেরক এবং প্রাপকের মধ্যে মিথস্ক্রিয়া এখন একটি "সেশন" হিসাবে উপস্থাপন করা হয়। সেশন SessionManager ক্লাস সেশন লাইফসাইকেল পরিচালনা করে এবং ব্যবহারকারীর অঙ্গভঙ্গির প্রতিক্রিয়ায় সেশনগুলি স্বয়ংক্রিয়ভাবে শুরু হয় এবং বন্ধ করে দেয়: ব্যবহারকারী যখন কাস্ট ডায়ালগে একটি কাস্ট ডিভাইস নির্বাচন করে তখন একটি সেশন শুরু হয় এবং যখন ব্যবহারকারী কাস্টে "স্টপ কাস্টিং" বোতামে ট্যাপ করে তখন শেষ হয় ডায়ালগ বা যখন প্রেরক অ্যাপ নিজেই বন্ধ হয়ে যায়।

সিসিএল-এ আপনাকে কাস্ট সেশন স্ট্যাটাস ট্র্যাক করতে VideoCastConsumerImpl ক্লাস প্রসারিত করতে হবে:

private final VideoCastConsumer mCastConsumer = new VideoCastConsumerImpl() {
  public void onApplicationConnected(ApplicationMetadata appMetadata, 
                                     String sessionId,
                                     boolean wasLaunched) {}
  public void onDisconnectionReason(int reason) {}
  public void onDisconnected() {}
}

SessionManager তে, সেশন ম্যানেজার-এর সাথে একটি SessionManagerListener রেজিস্টার করে সেশন লাইফসাইকেল ইভেন্টের বিষয়ে প্রেরকের আবেদন জানানো যেতে পারে। SessionManagerListener কলব্যাক সমস্ত সেশন জীবনচক্র ইভেন্টের জন্য কলব্যাক পদ্ধতি সংজ্ঞায়িত করে।

নিম্নলিখিত SessionManagerListener পদ্ধতিগুলি CCL এর VideoCastConsumer ইন্টারফেস থেকে ম্যাপ করা হয়েছে:

  • VideoCastConsumer.onApplicationConnected -> SessionManagerListener.onSessionStarted
  • VideoCastConsumer.onDisconnected -> SessionManagerListener.onSessionEnded

SessionManagerListener ইন্টারফেস প্রয়োগ করে এমন একটি ক্লাস ঘোষণা করুন এবং VideoCastConsumerImpl লজিককে ম্যাচিং পদ্ধতিতে সরান:

private class CastSessionManagerListener implements SessionManagerListener<CastSession> {
  public void onSessionEnded(CastSession session, int error) {}
  public void onSessionStarted(CastSession session, String sessionId) {}
  public void onSessionEnding(CastSession session) {}
  ...
}

CastSession ক্লাস একটি কাস্ট ডিভাইস সহ একটি সেশন উপস্থাপন করে। ক্লাসে ডিভাইসের ভলিউম এবং নিঃশব্দ অবস্থা নিয়ন্ত্রণ করার পদ্ধতি রয়েছে, যা CCL BaseCastManager করে।

একটি ভোক্তা যোগ করার জন্য CCL VideoCastManager ব্যবহার করার পরিবর্তে:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

এখন আপনার SessionManagerListener নিবন্ধন করুন:

mCastSessionManager = 
    CastContext.getSharedInstance(this).getSessionManager();
mCastSessionManagerListener = new CastSessionManagerListener();
mCastSessionManager.addSessionManagerListener(mCastSessionManagerListener,
                  CastSession.class);

সিসিএলে ইভেন্ট শোনা বন্ধ করতে:

VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);

সেশন ইভেন্টগুলি শোনা বন্ধ করতে এখন সেশন SessionManager ব্যবহার করুন:

mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
                    CastSession.class);

কাস্ট ডিভাইস থেকে স্পষ্টভাবে সংযোগ বিচ্ছিন্ন করতে, CCL ব্যবহার করা হয়েছে:

VideoCastManager.disconnectDevice(boolean stopAppOnExit, 
            boolean clearPersistedConnectionData,
            boolean setDefaultRoute)

CAF এর জন্য, SessionManager ব্যবহার করুন:

CastContext.getSharedInstance(this).getSessionManager()
                                   .endCurrentSession(true);

প্রেরক রিসিভারের সাথে সংযুক্ত কিনা তা নির্ধারণ করতে, CCL VideoCastManager.getInstance().isConnected() প্রদান করে, কিন্তু CAF-তে SessionManager ব্যবহার করুন:

public boolean isConnected() {
    CastSession castSession = CastContext.getSharedInstance(mAppContext)
                                  .getSessionManager()
                                  .getCurrentCastSession();
    return (castSession != null && castSession.isConnected());
}

CAF-তে, ভলিউম/মিউট স্টেট পরিবর্তনের বিজ্ঞপ্তিগুলি এখনও Cast.Listener এ কলব্যাক পদ্ধতির মাধ্যমে বিতরণ করা হয়; এই শ্রোতারা CastSession এর সাথে নিবন্ধিত। অবশিষ্ট ডিভাইসের সমস্ত রাষ্ট্রীয় বিজ্ঞপ্তি CastStateListener কলব্যাকের মাধ্যমে বিতরণ করা হয়; এই শ্রোতারা CastSession এর সাথে নিবন্ধিত। নিশ্চিত করুন যে আপনি এখনও শ্রোতাদের নিবন্ধনমুক্ত করেছেন যখন সংশ্লিষ্ট টুকরা, কার্যকলাপ বা অ্যাপগুলি ব্যাকগ্রাউন্ডে যায়।

পুনঃসংযোগ যুক্তি

CAF অস্থায়ী ওয়াইফাই সিগন্যাল ক্ষতি বা অন্যান্য নেটওয়ার্ক ত্রুটির কারণে হারিয়ে যাওয়া নেটওয়ার্ক সংযোগগুলি পুনঃস্থাপন করার চেষ্টা করে৷ এটি এখন সেশন স্তরে করা হয়; সংযোগ হারিয়ে গেলে একটি সেশন একটি "সাসপেন্ডেড" অবস্থায় প্রবেশ করতে পারে এবং সংযোগ পুনরুদ্ধার করা হলে এটি একটি "সংযুক্ত" অবস্থায় ফিরে যাবে। এই প্রক্রিয়ার অংশ হিসাবে ফ্রেমওয়ার্ক রিসিভার অ্যাপ্লিকেশনের সাথে পুনঃসংযোগ এবং যেকোনো কাস্ট চ্যানেল পুনরায় সংযোগ করার যত্ন নেয়।

CAF এর নিজস্ব পুনঃসংযোগ পরিষেবা প্রদান করে, তাই আপনি আপনার ম্যানিফেস্ট থেকে CCL ReconnectionService সরিয়ে দিতে পারেন:

<service android:name="com.google.android.libraries.cast.companionlibrary.cast.reconnection.ReconnectionService"/>

পুনঃসংযোগ যুক্তির জন্য আপনার ম্যানিফেস্টে নিম্নলিখিত অনুমতিগুলিরও প্রয়োজন নেই:

<uses‐permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses‐permission android:name="android.permission.ACCESS_WIFI_STATE"/>

CAF পুনঃসংযোগ পরিষেবাটি ডিফল্টরূপে সক্রিয় থাকে তবে CastOptions ব্যবহার করে অক্ষম করা যেতে পারে৷

এছাড়াও, CAF এছাড়াও স্বয়ংক্রিয় সেশন পুনঃসূচনা যোগ করে যা ডিফল্টরূপে সক্রিয় থাকে (এবং CastOptions মাধ্যমে নিষ্ক্রিয় করা যেতে পারে)। যদি প্রেরকের অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে পাঠানো হয় বা একটি কাস্ট সেশন চলাকালীন (দূরে সোয়াইপ করে বা ক্র্যাশের কারণে) বন্ধ করা হয়, প্রেরক অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে ফিরে গেলে বা পুনরায় লঞ্চ করা হলে ফ্রেমওয়ার্ক সেই সেশনটি পুনরায় শুরু করার চেষ্টা করবে; এটি SessionManager দ্বারা স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়, যা যেকোনো নিবন্ধিত SessionManagerListener দৃষ্টান্তে উপযুক্ত কলব্যাক জারি করবে।

কাস্টম চ্যানেল নিবন্ধন

সিসিএল রিসিভারকে একটি কাস্টম বার্তা চ্যানেল তৈরি করার দুটি উপায় প্রদান করে:

  • CastConfiguration আপনাকে একাধিক নামস্থান নির্দিষ্ট করতে দেয় এবং CCL তারপর আপনার জন্য চ্যানেল তৈরি করবে।
  • DataCastManager এর মতোই কিন্তু অ-মিডিয়া ব্যবহারের ক্ষেত্রে ফোকাস করে।

একটি কাস্টম চ্যানেল তৈরি করার এই উপায়গুলির কোনটিই CAF দ্বারা সমর্থিত নয় -- আপনাকে পরিবর্তে আপনার প্রেরক অ্যাপের জন্য একটি কাস্টম চ্যানেল যুক্ত করার পদ্ধতি অনুসরণ করতে হবে৷

সিসিএল-এর মতো, মিডিয়া অ্যাপ্লিকেশনের জন্য, মিডিয়া নিয়ন্ত্রণ চ্যানেলটি স্পষ্টভাবে নিবন্ধন করার প্রয়োজন নেই।

মিডিয়া নিয়ন্ত্রণ

CAF-তে, RemoteMediaClient ক্লাস VideoCastManager মিডিয়া পদ্ধতির সমতুল্য। RemoteMediaClient.Listener VideoCastConsumer পদ্ধতির সমতুল্য। বিশেষ করে, onRemoteMediaPlayerMetadataUpdated এবং onRemoteMediaPlayerStatusUpdated পদ্ধতিগুলি যথাক্রমে VideoCastConsumer এর onMetadataUpdated এবং onStatusUpdated পদ্ধতিতে RemoteMediaClient.Listener করে:

private class CastMediaClientListener implements RemoteMediaClient.Listener {

    @Override
    public void onMetadataUpdated() {
        setMetadataFromRemote();
    }

    @Override
    public void onStatusUpdated() {
        updatePlaybackState();
    }

    @Override
    public void onSendingRemoteMediaRequest() {
    }

    @Override
    public void onQueueStatusUpdated() {
    }

    @Override
    public void onPreloadStatusUpdated() {
    }
}

RemoteMediaClient অবজেক্টটি স্পষ্টভাবে আরম্ভ বা নিবন্ধন করার প্রয়োজন নেই; ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে অবজেক্টটিকে ইনস্ট্যান্টিয়েট করবে এবং সেশন শুরুর সময়ে অন্তর্নিহিত মিডিয়া চ্যানেল নিবন্ধন করবে যদি রিসিভার অ্যাপ্লিকেশন মিডিয়া নেমস্পেস সমর্থন করে।

RemoteMediaClient কে CastSession অবজেক্টের getRemoteMediaClient পদ্ধতি হিসাবে অ্যাক্সেস করা যেতে পারে।

CastSession castSession = CastContext.getSharedInstance(mAppContext)
                                     .getSessionManager()
                                     .getCurrentCastSession();
mRemoteMediaClient = castSession.getRemoteMediaClient();
mRemoteMediaClientListener = new CastMediaClientListener();

CCL এর পরিবর্তে:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

এখন CAF ব্যবহার করুন:

mRemoteMediaClient.addListener(mRemoteMediaClientListener);

যেকোন সংখ্যক শ্রোতা RemoteMediaClient এর সাথে নিবন্ধিত হতে পারে, যা একাধিক প্রেরক উপাদানকে সেশনের সাথে যুক্ত RemoteMediaClient এর একক দৃষ্টান্ত শেয়ার করতে দেয়।

CCL এর VideoCastManager মিডিয়া প্লেব্যাক পরিচালনা করার পদ্ধতি প্রদান করে:

VideoCastManager manager = VideoCastManager.getInstance();
if (manager.isRemoteMediaLoaded()) {
    manager.pause();
    mCurrentPosition = (int) manager.getCurrentMediaPosition();
}

এগুলি এখন CAF-তে RemoteMediaClient দ্বারা প্রয়োগ করা হয়েছে:

if (mRemoteMediaClient.hasMediaSession()) {
    mRemoteMediaClient.pause();
    mCurrentPosition = 
        (int)mRemoteMediaClient.getApproximateStreamPosition();
}

CAF-এ, RemoteMediaClient-এ জারি করা সমস্ত মিডিয়া অনুরোধ একটি RemoteMediaClient.MediaChannelResult কলব্যাকের মাধ্যমে একটি RemoteMediaClient PendingResult যা অনুরোধের অগ্রগতি এবং চূড়ান্ত ফলাফল ট্র্যাক করতে ব্যবহার করা যেতে পারে।

CCL এবং CAF উভয়ই মিডিয়া আইটেমগুলি উপস্থাপন করতে এবং মিডিয়া লোড করতে MediaInfo এবং MediaMetadata ক্লাস ব্যবহার করে।

CCL-তে মিডিয়া লোড করতে, VideoCastManager ব্যবহার করা হয়:

VideoCastManager.getInstance().loadMedia(media, autoPlay, mCurrentPosition, customData);

CAF-তে, RemoteMediaClient মিডিয়া লোড করতে ব্যবহৃত হয়:

mRemoteMediaClient.load(media, autoPlay, mCurrentPosition, customData);

রিসিভারে Media তথ্য এবং বর্তমান মিডিয়া সেশনের স্থিতি পেতে, CCL VideoCastManager ব্যবহার করে:

MediaInfo mediaInfo = VideoCastManager.getInstance()
                                      .getRemoteMediaInformation();
int status = VideoCastManager.getInstance().getPlaybackStatus();
int idleReason = VideoCastManager.getInstance().getIdleReason();

CAF-তে, একই তথ্য পেতে RemoteMediaClient ব্যবহার করুন:

MediaInfo mediaInfo = mRemoteMediaClient.getMediaInfo();
int status = mRemoteMediaClient.getPlayerState();
int idleReason = mRemoteMediaClient.getIdleReason();

পরিচায়ক ওভারলে

CCL এর মতো, CAF একটি কাস্টম ভিউ IntroductoryOverlay প্রদান করে কাস্ট বোতামটি হাইলাইট করার জন্য যখন এটি ব্যবহারকারীদের কাছে প্রথম দেখানো হয়।

কখন ওভারলে প্রদর্শন করতে হবে তা জানতে CCL-এর VideoCastConsumer onCastAvailabilityChanged পদ্ধতি ব্যবহার করার পরিবর্তে, MediaRouter দ্বারা কাস্ট ডিভাইসগুলি স্থানীয় নেটওয়ার্কে আবিষ্কৃত হলে কাস্ট বোতামটি কখন দৃশ্যমান হবে তা নির্ধারণ করতে একটি CastStateListener ঘোষণা করুন:

private IntroductoryOverlay mIntroductoryOverlay;
private MenuItem mMediaRouteMenuItem;

protected void onCreate(Bundle savedInstanceState) {
    ...
    mCastStateListener = new CastStateListener() {
        @Override
        public void onCastStateChanged(int newState) {
            if (newState != CastState.NO_DEVICES_AVAILABLE) {
                showIntroductoryOverlay();
            }
        }
    };
    mCastContext = CastContext.getSharedInstance(this);
    mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this, 
        savedInstanceState);
}

protected void onResume() {
    mCastContext.addCastStateListener(mCastStateListener);
    ...
}

protected void onPause() {
    mCastContext.removeCastStateListener(mCastStateListener);
    ...
}

MediaRouteMenuItem উদাহরণ ট্র্যাক রাখুন:

public boolean onCreateOptionsMenu(Menu menu) {
   super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    mMediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(
            getApplicationContext(), menu,
            R.id.media_route_menu_item);
    showIntroductoryOverlay();
    return true;
}

MediaRouteButton দৃশ্যমান কিনা তা পরীক্ষা করুন যাতে পরিচায়ক ওভারলে দেখানো যায়:

private void showIntroductoryOverlay() {
    if (mIntroductoryOverlay != null) {
        mIntroductoryOverlay.remove();
    }
    if ((mMediaRouteMenuItem != null) && mMediaRouteMenuItem.isVisible()) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mIntroductoryOverlay = new IntroductoryOverlay.Builder(
                        VideoBrowserActivity.this, mMediaRouteMenuItem)
                        .setTitleText(getString(R.string.introducing_cast))
                        .setOverlayColor(R.color.primary)
                        .setSingleTime()
                        .setOnOverlayDismissedListener(
                                new IntroductoryOverlay
                                    .OnOverlayDismissedListener() {
                                        @Override
                                        public void onOverlayDismissed() {
                                            mIntroductoryOverlay = null;
                                        }
                                })
                        .build();
                mIntroductoryOverlay.show();
            }
        });
    }
}

পরিচায়ক ওভারলে দেখানোর জন্য সম্পূর্ণ কাজের কোডের জন্য আমাদের নমুনা অ্যাপটি দেখুন।

পরিচায়ক ওভারলে এর স্টাইলিং কাস্টমাইজ করতে, পদ্ধতিটি অনুসরণ করুন কাস্টমাইজ পরিচিতি ওভারলে

মিনি কন্ট্রোলার

CCL-এর MiniController এর পরিবর্তে, আপনার অ্যাপ লেআউট ফাইলে MiniControllerFragment এর MiniControllerFragment ব্যবহার করুন যেখানে আপনি মিনি কন্ট্রোলার দেখাতে চান:

<fragment
        android:id="@+id/cast_mini_controller"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:castShowImageThumbnail="true"
        android:visibility="gone"
        class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" />

CAF CCL এর MiniController দ্বারা সমর্থিত ম্যানুয়াল কনফিগারেশন সমর্থন করে না এবং Autoplay বৈশিষ্ট্যকেও সমর্থন করে না।

মিনি কন্ট্রোলারের স্টাইলিং এবং বোতামগুলি কাস্টমাইজ করতে, মিনি কন্ট্রোলার কাস্টমাইজ করুন পদ্ধতিটি অনুসরণ করুন।

বিজ্ঞপ্তি এবং লক স্ক্রীন

CCL-এর VideoCastNotificationService এর মতো, CAF কাস্ট করার সময় মিডিয়া বিজ্ঞপ্তিগুলির প্রদর্শন পরিচালনা করতে একটি MediaNotificationService প্রদান করে।

আপনাকে আপনার ম্যানিফেস্ট থেকে নিম্নলিখিতগুলি সরাতে হবে:

  • VideoIntentReceiver
  • VideoCastNotificationService

CCL CastConfiguration.Builder এর সাথে একটি কাস্টম বিজ্ঞপ্তি পরিষেবা প্রদান সমর্থন করে; যে CAF দ্বারা সমর্থিত নয়.

CCL ব্যবহার করে নিম্নলিখিত CastManager আরম্ভ বিবেচনা করুন:

VideoCastManager.initialize(
   getApplicationContext(),
   new CastConfiguration.Builder(
           context.getString(R.string.app_id))
       .addNotificationAction(
           CastConfiguration.NOTIFICATION_ACTION_PLAY_PAUSE,true)
       .addNotificationAction(
           CastConfiguration.NOTIFICATION_ACTION_DISCONNECT,true)
       .build());

CAF-তে সমতুল্য কনফিগারেশনের জন্য, SDK একটি NotificationsOptions.Builder প্রদান করে যাতে আপনি বিজ্ঞপ্তির জন্য মিডিয়া নিয়ন্ত্রণ তৈরি করতে এবং প্রেরক অ্যাপে স্ক্রিন লক করতে সাহায্য করেন। CastContext আরম্ভ করার সময় বিজ্ঞপ্তি এবং লক স্ক্রীন নিয়ন্ত্রণগুলি CastOptions দিয়ে সক্ষম করা যেতে পারে৷

public CastOptions getCastOptions(Context context) {
    NotificationOptions notificationOptions = 
        new NotificationOptions.Builder()
            .setActions(Arrays.asList(
                MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
                MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{0, 1})
            .build();
    CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
             .setNotificationOptions(notificationOptions)
             .build();
    return new CastOptions.Builder()
             .setReceiverApplicationId(context.getString(R.string.app_id))
             .setCastMediaOptions(mediaOptions)
             .build();
}

বিজ্ঞপ্তি এবং লক স্ক্রিন নিয়ন্ত্রণ সবসময় CAF এ সক্ষম করা হয়। এছাড়াও, মনে রাখবেন প্লে/পজ এবং স্টপ কাস্টিং বোতামগুলি ডিফল্টরূপে সরবরাহ করা হয়। CAF স্বয়ংক্রিয়ভাবে জিঞ্জারব্রেড ছাড়া মিডিয়া বিজ্ঞপ্তি কখন প্রদর্শন করতে হবে তা সিদ্ধান্ত নেওয়ার জন্য কার্যকলাপের দৃশ্যমানতা ট্র্যাক করবে। (জিঞ্জারব্রেডের জন্য, registerLifecycleCallbacksBeforeIceCreamSandwich() ব্যবহার করার পূর্বের নোটটি দেখুন; CCL-এর VideoCastManager incrementUiCounter এবং decrementUiCounter কলগুলি সরানো উচিত।)

বিজ্ঞপ্তিগুলিতে প্রদর্শিত বোতামগুলি কাস্টমাইজ করতে, বিজ্ঞপ্তি এবং লক স্ক্রীনে মিডিয়া নিয়ন্ত্রণ যোগ করুন পদ্ধতিটি অনুসরণ করুন।

প্রসারিত নিয়ামক

মিডিয়া কাস্ট করার সময় একটি প্রসারিত নিয়ামক প্রদর্শন করতে CCL VideoCastControllerActivity এবং VideoCastControllerFragment প্রদান করে।

আপনি ম্যানিফেস্টে VideoCastControllerActivity ঘোষণাটি সরাতে পারেন।

CAF-এ, আপনাকে ExpandedControllerActivity প্রসারিত করতে হবে এবং কাস্ট বোতাম যোগ করতে হবে

প্রসারিত কন্ট্রোলারে প্রদর্শিত শৈলী এবং বোতামগুলি কাস্টমাইজ করতে, প্রসারিত কন্ট্রোলার কাস্টমাইজ করুন পদ্ধতিটি অনুসরণ করুন।

অডিও ফোকাস

সিসিএল-এর মতো, অডিও ফোকাস স্বয়ংক্রিয়ভাবে পরিচালিত হয়।

ভলিউম নিয়ন্ত্রণ

জিঞ্জারব্রেডের জন্য, CCL-এর মতোই dispatchKeyEvent প্রয়োজন। ICS এবং তার উপরে CCL এবং CAF উভয়ের জন্য ভলিউম নিয়ন্ত্রণ স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়।

CAF আপনার অ্যাপ ক্রিয়াকলাপগুলির মধ্যে ফোনের হার্ড ভলিউম বোতামের মাধ্যমে কাস্ট ভলিউম নিয়ন্ত্রণ করতে সক্ষম করে এবং সমর্থিত সংস্করণগুলিতে কাস্ট করার সময় একটি ভিজ্যুয়াল ভলিউম বারও দেখায়৷ CAF হার্ড ভলিউমের মাধ্যমে ভলিউমের পরিবর্তন পরিচালনা করে এমনকি আপনার অ্যাপ সামনে না থাকলেও, লক করা থাকে বা স্ক্রিন বন্ধ থাকলেও।

শিরোনাম বন্ধ কর

অ্যান্ড্রয়েড কিটক্যাট এবং তার উপরে, ক্যাপশন সেটিংসের মাধ্যমে ক্যাপশনগুলি কাস্টমাইজ করা যেতে পারে, সেটিংস > অ্যাক্সেসিবিলিটির অধীনে পাওয়া যায়। তবে অ্যান্ড্রয়েডের আগের সংস্করণগুলিতে এই ক্ষমতা নেই। CCL পূর্ববর্তী সংস্করণগুলির জন্য কাস্টম সেটিংস প্রদান করে এবং KitKat এবং তার উপরে সিস্টেম সেটিংসে অর্পণ করে এটি পরিচালনা করে।

ক্যাপশন পছন্দ পরিবর্তন করতে CAF কাস্টম সেটিংস প্রদান করে না। আপনি আপনার ম্যানিফেস্ট এবং আপনার পছন্দ XML থেকে CaptionsPreferenceActivity রেফারেন্সগুলি সরিয়ে ফেলুন৷

CCL-এর TracksChooserDialog এর আর প্রয়োজন নেই কারণ ক্লোজড ক্যাপশন ট্র্যাকগুলি পরিবর্তন করা প্রসারিত কন্ট্রোলার UI দ্বারা পরিচালিত হয়৷

CAF-তে ক্লোজড ক্যাপশনিং API v2 এর মতো।

আমি আজ খুশি

CAF ডিবাগ লগিং সেটিংস প্রদান করে না।

বিবিধ

নিম্নলিখিত সিসিএল বৈশিষ্ট্যগুলি CAF-তে সমর্থিত নয়:

  • একটি MediaAuthService প্রদান করে প্লেব্যাকের আগে অনুমোদন প্রাপ্ত করা
  • কনফিগারযোগ্য UI বার্তা

নমুনা অ্যাপ্লিকেশন

আমাদের ইউনিভার্সাল মিউজিক প্লেয়ার ফর অ্যান্ড্রয়েড (uamp) নমুনা অ্যাপ CCL থেকে CAF-তে স্থানান্তরিত করার জন্য পার্থক্যটি দেখুন।

আমাদের কাছে কোডল্যাব টিউটোরিয়াল এবং নমুনা অ্যাপ রয়েছে যা CAF ব্যবহার করে।