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

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

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

はじめに

  • CAF センダーは、Android SDK Manager を使用して Google Play 開発者サービスの一部として配布されます。
  • Google Cast デザイン チェックリスト(com.google.android.gms.cast.framework.*)に準拠するパッケージが追加されました。
  • CAF センダーには、Cast UX の要件に準拠したウィジェットが用意されています。v2 には UI コンポーネントが用意されておらず、これらのウィジェットを実装する必要がありました。
  • Cast API を使用するために GoogleApiClient を使用する必要がなくなりました。
  • CAF センダーのクローズド キャプションは v2 と同様です。

依存関係

v2 と CAF は、サポート ライブラリの機能ガイドで説明されているように、サポート ライブラリと Google Play 開発者サービス(9.2.0 以降)に同じ依存関係があります。

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

初期化

CAF では、Cast フレームワークの明示的な初期化手順が必要です。これには、適切な 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 を Cast フレームワークに接続するように、各アクティビティの 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 アプリケーションを起動する必要はありません(また、試行しないでください)。センダーと Web Receiver の間のやり取りは「セッション」として表されるようになりました。 SessionManager クラスはセッションのライフサイクルを処理し、ユーザー操作に応じてセッションを自動的 に開始および停止します。ユーザーがキャスト ダイアログで Cast デバイスを選択するとセッションが開始され、ユーザーがキャスト ダイアログで [キャストを停止] ボタンをタップするか、センダーアプリ自体が終了するとセッションが終了します。センダー アプリケーションは、セッションのライフサイクル イベントの通知を SessionManagerListener に登録することで受け取ることができます。SessionManagerSessionManagerListener コールバックは、すべてのセッション ライフサイクル イベントのコールバック メソッドを定義します。

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

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

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

再接続ロジック

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

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

カスタム チャネルの登録

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

メディア コントロール

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

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

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

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

v2 RemoteMediaPlayer は、Web Receiver のメディア プレーヤーの状態の変更に関する通知を 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 で通知とロック画面のコントロールを有効にできます。CastContext

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