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

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

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

はじめに

  • CAF Sender は、Android SDK Manager を使用して Google Play 開発者サービスの一部として引き続き配布されます
  • Google Cast デザイン チェックリスト(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 では、Cast フレームワークの明示的な初期化ステップが必要です。これには、適切な OptionsProvider を使用して CastContext シングルトンを初期化し、ウェブ レシーバー アプリケーション ID やその他のグローバル オプションを指定することが含まれます。

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 レシーバー アプリの起動を処理する必要はありません(また、処理しようとすべきでもありません)。送信者とウェブ レシーバ間のやり取りが「セッション」として表されるようになりました。SessionManager クラスはセッションのライフサイクルを処理し、ユーザー操作に応じてセッションを自動的に開始および停止します。セッションは、ユーザーがキャスト ダイアログでキャスト デバイスを選択すると開始され、ユーザーがキャスト ダイアログで [キャストを停止] ボタンをタップするか、送信側アプリ自体が終了すると終了します。送信側アプリは、SessionManagerSessionManagerListener を登録することで、セッション ライフサイクル イベントの通知を受け取ることができます。SessionManagerListener コールバックは、すべてのセッション ライフサイクル イベントのコールバック メソッドを定義します。

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

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

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

再接続ロジック

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

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

カスタム チャネルの登録

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

メディア コントロール

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

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

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

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

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

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

v2 では、センダー アプリケーションが、ウェブ レシーバーのメディア プレーヤーの状態とユーザー インターフェースを同期させる必要がありました。

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 チュートリアルサンプルアプリがあります。