次の手順では、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 では、アプリがフォアグラウンドに移るときとバックグラウンドに移るときに、それぞれ検出プロセスがフレームワークによって自動的に開始、停止します。MediaRouteSelector
と MediaRouter.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
クラスは、セッションのライフサイクルを処理し、ユーザーの操作に応じてセッションを自動的に開始および停止します。セッションは、ユーザーがキャスト ダイアログでキャスト デバイスを選択すると開始され、ユーザーがキャスト ダイアログの [キャストを停止] ボタンをタップしたとき、または送信側のアプリ自体が終了したときに終了します。送信側アプリケーションは、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 では、同等の機能を便利な API で提供する新しい RemoteMediaClient
クラスに置き換えられています。このオブジェクトを明示的に初期化または登録する必要はありません。接続先の Web Receiver アプリケーションがメディア名前空間をサポートしている場合、フレームワークは自動的にオブジェクトをインスタンス化し、セッションの開始時刻に基盤となるメディア チャンネルを登録します。
RemoteMediaClient
には、CastSession
オブジェクトの getRemoteMediaClient
メソッドとしてアクセスできます。
v2 では、RemoteMediaPlayer
に対して発行されるすべてのメディア リクエストは、PendingResult
コールバックを介して RemoteMediaPlayer.MediaChannelResult
を返します。
CAF では、RemoteMediaClient
で発行されたすべてのメディア リクエストが PendingResult
コールバックを介して RemoteMediaClient.MediaChannelResult
を返します。これにより、リクエストの進行状況と最終的な結果を追跡できます。
v2 の RemoteMediaPlayer
は、RemoteMediaPlayer.OnStatusUpdatedListener
を介して、ウェブ レシーバーのメディア プレーヤーの状態の変化に関する通知を送信します。
CAF では、RemoteMediaClient
は RemoteMediaClient.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 のチュートリアルとサンプルアプリがあります。