次の手順では、CastContext シングルトンに基づいて、Android 送信側アプリを Cast SDK v2 から CAF 送信側に変換できます。
Cast CAF Sender 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 フレームワークに明示的な初期化ステップが必要です。これには、CastContext シングルトンの初期化、適切な OptionsProvider を使用したウェブ レシーバー アプリケーション 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 では、アプリがフォアグラウンドに移動するとフレームワークによって検出プロセスが自動的に開始され、バックグラウンドに移動すると停止されます。MediaRouteSelector と MediaRouter.Callback は使用しないでください。
キャスト アイコンとキャスト ダイアログ
v2 と同様に、これらのコンポーネントは MediaRouter サポート ライブラリによって提供されます。
キャスト アイコンは引き続き MediaRouteButton によって実装され、ActionBar または Toolbar を使用して、メニューのメニュー項目として Activity に追加できます。
<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 を使用して各 Activity の onCreateOptionMenu() メソッドをオーバーライドし、MediaRouteButton を Cast フレームワークに接続します。
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 を使用してデバイスに接続し、ウェブ レシーバー アプリを起動する処理を行う必要はありません(また、行おうとしないでください)。送信側とウェブ レシーバー間のやり取りは、「セッション」として表されるようになりました。SessionManager クラスは、セッションのライフサイクルを処理し、ユーザー ジェスチャーに応じてセッションを自動的に開始、停止します。セッションは、ユーザーがキャスト ダイアログでキャスト デバイスを選択すると開始され、ユーザーがキャスト ダイアログで [キャストを停止] ボタンをタップするか、送信側アプリ自体が終了すると終了します。送信側アプリは、SessionManagerListener を SessionManager に登録することで、セッション ライフサイクル イベントの通知を受け取ることができます。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 では、新しい RemoteMediaClient クラスに置き換えられています。このクラスは、より便利な API で同等の機能を提供します。このオブジェクトを明示的に初期化または登録する必要はありません。接続先のウェブ レシーバー アプリケーションがメディアの名前空間をサポートしている場合、フレームワークはセッションの開始時にオブジェクトを自動的にインスタンス化し、基盤となるメディア チャンネルを登録します。
RemoteMediaClient には、CastSession オブジェクトの getRemoteMediaClient メソッドとしてアクセスできます。
v2 では、RemoteMediaPlayer で発行されたすべてのメディア リクエストは、PendingResult コールバックを介して RemoteMediaPlayer.MediaChannelResult を返します。
CAF では、RemoteMediaClient で発行されたすべてのメディア リクエストは、PendingResult コールバックを介して RemoteMediaClient.MediaChannelResult を返します。これは、リクエストの進行状況と最終的な結果を追跡するために使用できます。
v2 の RemoteMediaPlayer は、RemoteMediaPlayer.OnStatusUpdatedListener を介して、ウェブ レシーバーのメディア プレーヤーの状態の変化に関する通知を送信します。
CAF では、RemoteMediaClient が RemoteMediaClient.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 チュートリアルとサンプルアプリが用意されています。