Android センダーアプリを Cast SDK v2 から Cast Application Framework(CAF)に移行する

次の手順では、Android センダーアプリを Cast SDK v2 から CAF 送信者(CastContext シングルトンに基づく)に変換できます。

Cast CAF Sender SDK は CastContext を使用して、ユーザーに代わって GoogleAPIClient を管理します。CastContext はライフサイクル、エラー、コールバックを管理するため、キャストアプリの開発が大幅に簡素化されます。

はじめに

  • CAF 送信者は、引き続き Android SDK Manager を使用して Google Play 開発者サービスの一部として配布されます。
  • Google Cast Design チェックリスト(com.google.android.gms.cast.framework.*)に準拠する責任を持つ新しいパッケージが追加されました
  • CAF Sender は Cast UX 要件を満たすウィジェットを提供します。v2 では UI コンポーネントが用意されていないため、これらのウィジェットを実装する必要がありました。
  • Cast API を使用するために GoogleApiClient を使用する必要がなくなりました。
  • CAF Sender の字幕は v2 と同様です。

依存関係

サポート ライブラリ機能ガイドに記載されているとおり、V2 と CAF は、サポート ライブラリと Google Play 開発者サービス(9.2.0 以降)に対して同じ依存関係があります。

CAF がサポートする最小 Android SDK バージョンは 9(Gingerbread)です。

初期化

CAF では、キャスト フレームワークに明示的な初期化ステップが必要です。これには、適切な OptionsProvider を使用して Web Receiver アプリケーション ID とその他のグローバル オプションを指定し、CastContext シングルトンが初期化されます。

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;
    }
}

アプリの AndroidManifest.xml ファイルの「application」タグ内で 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>

各アクティビティの onCreate メソッドで CastContext を遅延初期化します。

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

この手順は v2 では不要でした。

デバイス検出

CAF では、アプリがフォアグラウンドに移るときとバックグラウンドに移るときに、それぞれ検出プロセスがフレームワークによって自動的に開始、停止します。MediaRouteSelectorMediaRouter.Callback は使用しないでください。

キャスト アイコンとキャスト ダイアログ

v2 と同様に、これらのコンポーネントは MediaRouter サポート ライブラリによって提供されます。

キャスト アイコンは引き続き MediaRouteButton によって実装され、メニューのメニュー項目としてアクティビティに追加できます(ActionBar または Toolbar を使用します)。

<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"/>

CastButtonFactory を使用して MediaRouteButton をキャスト フレームワークに接続することで、各アクティビティの onCreateOptionMenu() メソッドをオーバーライドします。

private MenuItem mediaRouteMenuItem;

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

誰かがボタンをタップすると、キャスト ダイアログが自動的に表示されます。

デバイス コントロール

CAF では、デバイス コントロールの大部分がフレームワークによって処理されます。送信側アプリケーションは、デバイスへの接続や GoogleApiClient を使用した Web Receiver アプリケーションの起動を処理する必要はないため、処理を試みる必要もありません。送信者とウェブ受信者間のやり取りが「セッション」として表されるようになりました。SessionManager クラスは、セッションのライフサイクルを処理し、ユーザーの操作に応じてセッションを自動的に開始および停止します。セッションは、ユーザーがキャスト ダイアログでキャスト デバイスを選択すると開始され、ユーザーがキャスト ダイアログの [キャストを停止] ボタンをタップしたとき、または送信側のアプリ自体が終了したときに終了します。送信側アプリケーションは、SessionManagerListenerSessionManager に登録することで、セッションのライフサイクル イベントを通知できます。SessionManagerListener コールバックは、すべてのセッション ライフサイクル イベントのコールバック メソッドを定義します。

CastSession クラスはキャスト デバイスとのセッションを表します。このクラスには、デバイスの音量とミュート状態を制御するメソッドが用意されています。これは以前、v2 では Cast.CastApi のメソッドを使用して行われていました。

v2 では、Cast.Listener コールバックは、音量、ミュート状態、スタンバイ ステータスなど、デバイスの状態の変化の通知を提供します。

CAF では、引き続き Cast.Listener のコールバック メソッドを介して音量/ミュート状態の変化の通知が配信されます。これらのリスナーは CastSession に登録されます。残りのデバイス状態の通知はすべて、CastStateListener コールバックを介して配信されます。これらのリスナーは CastSession に登録されます。関連付けられているフラグメント、アクティビティ、アプリがバックグラウンドに移動したときにもリスナーの登録を解除してください。

再接続ロジック

v2 と同様に、CAF は一時的な Wi-Fi 信号の損失やその他のネットワーク エラーによって失われたネットワーク接続の再確立を試みます。これはセッション レベルで行われるようになりました。セッションは接続が失われると「一時停止」状態になり、接続が復元されると「接続済み」状態に戻ります。フレームワークは、このプロセスの一環として、ウェブ レシーバー アプリへの再接続とキャスト チャンネルの再接続を処理します。

また、CAF ではセッションの自動再開も追加されています。これはデフォルトで有効になっています(これは CastOptions で無効にできます)。キャスト セッションの進行中に送信側アプリがバックグラウンドに送信されたり、(スワイプやクラッシュによって)終了したりした場合、フレームワークは送信側アプリがフォアグラウンドに戻るか再起動されたときにセッションの再開を試みます。この処理は SessionManager によって自動的に処理され、登録済みの SessionManagerListener インスタンスに対して適切なコールバックが発行されます。

カスタム チャンネル登録

v2 では、カスタム チャネル(Cast.MessageReceivedCallback を使用して実装)は Cast.CastApi に登録されます。CAF では、カスタム チャネルは代わりに CastSession インスタンスに登録されます。登録は SessionManagerListener.onSessionStarted コールバック メソッドで行うことができます。メディアアプリの場合、Cast.CastApi.setMessageReceivedCallbacks を介してメディア コントロール チャネルを明示的に登録する必要がなくなりました。詳細については、次のセクションをご覧ください。

メディア コントロール

v2 クラス RemoteMediaPlayer はサポートが終了しているため、使用しないでください。CAF では、同等の機能を便利な API で提供する新しい RemoteMediaClient クラスに置き換えられています。このオブジェクトを明示的に初期化または登録する必要はありません。接続先の Web Receiver アプリケーションがメディア名前空間をサポートしている場合、フレームワークは自動的にオブジェクトをインスタンス化し、セッションの開始時刻に基盤となるメディア チャンネルを登録します。

RemoteMediaClient には、CastSession オブジェクトの getRemoteMediaClient メソッドとしてアクセスできます。

v2 では、RemoteMediaPlayer に対して発行されるすべてのメディア リクエストは、PendingResult コールバックを介して RemoteMediaPlayer.MediaChannelResult を返します。

CAF では、RemoteMediaClient で発行されたすべてのメディア リクエストが PendingResult コールバックを介して RemoteMediaClient.MediaChannelResult を返します。これにより、リクエストの進行状況と最終的な結果を追跡できます。

v2 の RemoteMediaPlayer は、RemoteMediaPlayer.OnStatusUpdatedListener を介して、ウェブ レシーバーのメディア プレーヤーの状態の変化に関する通知を送信します。

CAF では、RemoteMediaClientRemoteMediaClient.Listener インターフェースを介して同等のコールバックを提供します。RemoteMediaClient には任意の数のリスナーを登録できます。これにより、複数の送信コンポーネントが、セッションに関連付けられた RemoteMediaClient の単一のインスタンスを共有できます。

v2 では、送信側のアプリケーションが、ユーザー インターフェースと Web Receiver のメディア プレーヤーの状態の同期を維持する負担を負う必要がありました。

CAF では、この責任の大部分を UIMediaController クラスが担います。

案内用のオーバーレイ

V2 では、導入用のオーバーレイ UI は提供されていません。

CAF には、キャスト アイコンがユーザーに最初に表示されたときにハイライト表示されるカスタムビュー IntroductoryOverlay が用意されています。

ミニ コントローラ

v2 では、送信側アプリにミニ コントローラをゼロから実装する必要があります。

CAF では、SDK に MiniControllerFragment というカスタムビューが用意されています。このビューを、ミニ コントローラを表示するアクティビティのアプリ レイアウト ファイルに追加できます。

通知とロック画面

v2 では、通知とロック画面用のコントローラは SDK から提供されていません。その SDK では、Android フレームワーク API を使用して、送信アプリにこれらの機能を組み込む必要があります。

CAF では、SDK に用意されている NotificationsOptions.Builder を使用して、送信側アプリに通知とロック画面のメディア コントロールを構築できます。通知とロック画面のコントロールは、CastContext を初期化するときに CastOptions で有効にできます。

public CastOptions getCastOptions(Context context) {
    NotificationOptions notificationOptions = new NotificationOptions.Builder()
            .setTargetActivityClassName(VideoBrowserActivity.class.getName())
            .build();
    CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
            .setNotificationOptions(notificationOptions)
            .build();

    return new CastOptions.Builder()
            .setReceiverApplicationId(context.getString(R.string.app_id))
            .setCastMediaOptions(mediaOptions)
            .build();
}

拡張コントローラ

v2 では、送信側アプリに拡張コントローラをゼロから実装する必要があります。

CAF には、独自の拡張コントローラを簡単に構築できる UIMediaController ヘルパークラスが用意されています。

CAF では、事前構築済みの拡張コントローラ ウィジェット ExpandedControllerActivity が追加されます。このウィジェットは、アプリに追加するだけで済みます。UIMediaController を使用してカスタム拡張コントローラを実装する必要はありません。

音声フォーカス

v2 では、MediaSessionCompat を使用して音声フォーカスを管理する必要があります。

CAF では、音声フォーカスは自動的に管理されます。

デバッグログ

CAF にはロギング オプションがありません。

サンプルアプリ

CAF を使用する Codelab のチュートリアルサンプルアプリがあります。