次の手順で、送信元の Android アプリを CCL を含む SDK v2 を CAF にキャストします。CCL のすべての機能は、 実装されているため、移行後は CCL を使用する必要はありません。
Cast CAF Sender SDK は CastContext を使用して GoogleAPIClient を管理します。 CastContext はライフサイクル、エラー、コールバックを管理してくれます。 Cast アプリの開発が簡単になります。
はじめに
- CAF Sender の設計は Cast Companion Library の影響を受けているため、 CCL から CAF Sender への移行には、主に クラスとメソッドを定義します。
- CAF 送信者は引き続き Google Play 開発者サービスの一部として配布されます。 作成できます
- 追加された新しいパッケージ(
com.google.android.gms.cast.framework.*
) CAF Sender に追加され、CCL と同様の機能を備えており、 法令を遵守する責任は Google Cast デザインのチェックリスト - CAF Sender は Cast UX 要件を満たすウィジェットを提供します。 CCL のウィジェットと類似しています。
- CAF 送信者は、CCL に類似した非同期コールバックを提供し、 データを取得します。CCL とは異なり、CAF 送信者は NoOps を提供しない さまざまなインターフェース メソッドの実装。
以降のセクションでは、主に動画中心の CCL の VideoCastManager をベースにしていますが、多くの場合、 DataCastManager にも当てはまります。
依存関係
CCL と CAF は AppCompat サポート ライブラリに対して同じ依存関係を持ちます。 MediaRouter v7 サポート ライブラリと Google Play 開発者サービス。ただし、 CAF は Google Play で利用可能な新しいキャスト フレームワークに依存している点です。 サービス 9.2.0 以降が必要です。
build.gradle ファイルで、
com.google.android.gms:play-services-cast
、
com.google.android.libraries.cast.companionlibrary:ccl
,
次に、新しいキャスト フレームワークを追加します。
dependencies {
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:mediarouter-v7:23.4.0'
compile 'com.google.android.gms:play-services-cast-framework:9.4.0'
}
Google Play 開発者サービスのメタデータを削除することもできます。
<meta‐data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
CAF に含まれるすべてのサービス、アクティビティ、リソースは、 アプリのマニフェストやリソースと統合できます。
CAF がサポートする最小 Android SDK バージョンは 9 (Gingerbread);CCL の最小 Android SDK バージョンは 10 です。
CCL には、
BaseCastManager.checkGooglePlayServices(activity)
を使用して、互換性のある
利用可能なバージョンの Google Play 開発者サービスがデバイスで使用できる必要があります。CAF は
これは Cast SDK の一部として提供されます。手順に沿って操作する
デバイスに Google Play 開発者サービスの APK があることを確認する
正しい Google Play 開発者サービス APK がユーザーの
更新がすべてのユーザーにすぐに届くとは限らないためです。
アプリのコード ライブラリには、引き続き Theme.AppCompat のバリアントを使用する必要があります。 できます。
初期化
CCL では、VideoCastManager.initialize()
は
アプリケーション インスタンスの onCreate()
メソッド。このロジックは
アプリケーション クラスコードから削除されます。
CAF では、キャスト用に明示的な初期化ステップも必要です。
説明します。これには、CastContext
シングルトンの初期化が含まれます。
受信側のアプリケーション ID と任意の値を指定する適切な OptionsProvider
構成できますCastContext
は CCL と同様の役割を果たします。
VideoCastManager
。クライアントがやり取りするシングルトンを提供します。
OptionsProvider
は CCL の CastConfiguration
と類似しており、
キャスト フレームワーク機能を設定します。
現在の CCL CastConfiguration.Builder
が次のようになっているとします。
VideoCastManager.initialize(
getApplicationContext(),
new CastConfiguration.Builder(context.getString(R.string.app_id))
.enableWifiReconnection()
.enableAutoReconnect()
.build());
次に、CAF で、CastOptions.Builder
を使用した次の CastOptionsProvider
を実行します。
次のようになります。
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;
}
}
サンプルアプリを見る OptionsProvider の完全な実装については、こちらをご覧ください。
「application」内で OptionsProvider を宣言する要素である AndroidManifest.xml ファイル:
<application>
...
<meta-data
android:name=
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.refplayer.CastOptionsProvider"
/>
</application>
各 Activity
の onCreate
メソッドで CastContext
を遅延初期化する
(Application
インスタンスではない)。
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
CastContext
シングルトンにアクセスするには、次のコマンドを使用します。
mCastContext = CastContext.getSharedInstance(this);
デバイス検出
CCL の VideoCastManager
incrementUiCounter
と decrementUiCounter
が必要です
Activities
の onResume
メソッドと onPause
メソッドから削除されます。
CAF では、検出プロセスの開始と停止は、 アプリがフォアグラウンドに移って、バックグラウンドに移動したときに、 できます。
キャスト アイコンとキャスト ダイアログ
CCL と同様に、これらのコンポーネントは MediaRouter v7 のサポートによって提供されます。 ライブラリです。
キャスト アイコンは、引き続き MediaRouteButton
によって実装され、追加できます。
メニュー項目としてアクティビティに追加できます(ActionBar
または Toolbar
を使用)
を選択します。
メニュー xml での MediaRouteActionProvider
の宣言は、
CCL の場合:
<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"/>
CCL と同様に、各 Activity の onCreateOptionMenu() メソッドをオーバーライドしますが、 CastManager.addMediaRouterButton ではなく CAF の CastButtonFactory を使用します MediaRouteButton を Cast フレームワークに接続します。
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
デバイス コントロール
CCL と同様に、CAF では、デバイス コントロールの大部分がフレームワークによって処理されます。
送信側アプリケーションで
デバイスに接続して受信側のアプリを起動します。
GoogleApiClient
。
送信者と受信者の間のやり取りが「セッション」として表されるようになりました。「
SessionManager
クラスはセッションのライフサイクルを処理し、
ユーザーの操作に応じてセッションを停止します。
ユーザーがキャスト ダイアログでキャスト デバイスを選択し、タップすると終了する
[キャストを停止]ボタン、または送信側アプリ自体が
終了します。
CCL では、キャストをトラッキングするために VideoCastConsumerImpl
クラスを拡張する必要がある
セッションのステータス:
private final VideoCastConsumer mCastConsumer = new VideoCastConsumerImpl() {
public void onApplicationConnected(ApplicationMetadata appMetadata,
String sessionId,
boolean wasLaunched) {}
public void onDisconnectionReason(int reason) {}
public void onDisconnected() {}
}
CAF では、次の方法でセッションのライフサイクル イベントを送信元アプリケーションに通知できます。
SessionManagerListener
を SessionManager
に登録します。「
SessionManagerListener コールバックはすべてのセッションのコールバック メソッドを定義
作成できます。
次の SessionManagerListener
メソッドは、CCL の
VideoCastConsumer
インターフェース:
VideoCastConsumer.onApplicationConnected
->SessionManagerListener.onSessionStarted
VideoCastConsumer.onDisconnected
->SessionManagerListener.onSessionEnded
SessionManagerListener
インターフェースを実装するクラスを宣言して移動する
VideoCastConsumerImpl
ロジックを一致するメソッドに渡します。
private class CastSessionManagerListener implements SessionManagerListener<CastSession> {
public void onSessionEnded(CastSession session, int error) {}
public void onSessionStarted(CastSession session, String sessionId) {}
public void onSessionEnding(CastSession session) {}
...
}
CastSession
クラスはキャスト デバイスとのセッションを表します。このクラスには、
デバイスの音量とミュート状態を制御するメソッドです。CCL は
BaseCastManager
。
CCL の VideoCastManager
を使用してコンシューマを追加する代わりに、次のようにします。
VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);
SessionManagerListener
を登録します。
mCastSessionManager =
CastContext.getSharedInstance(this).getSessionManager();
mCastSessionManagerListener = new CastSessionManagerListener();
mCastSessionManager.addSessionManagerListener(mCastSessionManagerListener,
CastSession.class);
CCL でイベントのリッスンを停止するには:
VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);
次に、SessionManager
を使用してセッション イベントのリッスンを停止します。
mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
CastSession.class);
キャスト デバイスから明示的に切断するために、CCL は次の方法を使用しました。
VideoCastManager.disconnectDevice(boolean stopAppOnExit,
boolean clearPersistedConnectionData,
boolean setDefaultRoute)
CAF の場合は、SessionManager
を使用します。
CastContext.getSharedInstance(this).getSessionManager()
.endCurrentSession(true);
送信者が受信者に接続されているかどうかを判断するために、CCL は
VideoCastManager.getInstance().isConnected()
。ただし CAF では
SessionManager
:
public boolean isConnected() {
CastSession castSession = CastContext.getSharedInstance(mAppContext)
.getSessionManager()
.getCurrentCastSession();
return (castSession != null && castSession.isConnected());
}
CAF では、引き続きコールバックを介して音量/ミュート状態の変化の通知が配信されます。
Cast.Listener
のメソッドこれらのリスナーは、イベントに関連付けられた
CastSession
。デバイスの状態に関する残りの通知はすべて、
CastStateListener
コールバックこれらのリスナーは
CastSession
。関連付けられているリスナーが
バックグラウンドに移ります。
再接続ロジック
CAF は、 一時的な Wi-Fi 信号の損失や、その他のネットワーク エラーなどが原因です。これで セッション レベルセッションは「一時停止」ステータス、接続が構成されている場合の 「コネクテッド」状態に戻り、接続が維持される場合の 復元しました。フレームワークが受信アプリへの再接続を処理する キャスト チャンネルを再接続します。
CAF は独自の再接続サービスを提供しているため、
マニフェストの CCL ReconnectionService
を次のように変更します。
<service android:name="com.google.android.libraries.cast.companionlibrary.cast.reconnection.ReconnectionService"/>
また、マニフェスト ファイルには次の権限は必要ありません。 再接続ロジック:
<uses‐permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses‐permission android:name="android.permission.ACCESS_WIFI_STATE"/>
CAF 再接続サービスはデフォルトで有効になっていますが、
CastOptions
。
さらに、CAF によってセッションの自動再開も追加され、
デフォルト(CastOptions
で無効にできます)。送信側アプリケーションが
終了するか(スワイプで削除した、またはクラッシュが原因)
キャスト セッションの進行中に、フレームワークはキャスト セッションの再開を試みます。
送信側のアプリがフォアグラウンドに戻ったとき、または再起動されたとき。
これは SessionManager
によって自動的に処理され、
登録済みの SessionManagerListener
インスタンスに対する適切なコールバック。
カスタム チャンネル登録
CCL では、次の 2 つの方法で、受信者へのカスタム メッセージ チャネルを作成できます。
CastConfiguration
を使用すると複数の名前空間を指定できます。CCL では、 チャンネルを作成しますDataCastManager
は VideoCastManager に似ていますが、メディア以外に焦点を当てています。 構築できます
カスタム チャネルを作成する上記のいずれの方法も、CAF ではサポートされていません。 通常のショッピングキャンペーンを カスタム チャネルを追加する 追加します。
CCL と同様に、メディア アプリケーションの場合、 メディア コントロール チャンネルを登録します。
メディア コントロール
CAF では、RemoteMediaClient
クラスは VideoCastManager
と同等です。
使用できます。RemoteMediaClient.Listener
は次の式と同等です。
VideoCastConsumer
メソッド。特に
onRemoteMediaPlayerMetadataUpdated
および onRemoteMediaPlayerStatusUpdated
VideoCastConsumer
のメソッドは onMetadataUpdated
にマッピングされ、
それぞれ RemoteMediaClient.Listener
の onStatusUpdated
メソッド:
private class CastMediaClientListener implements RemoteMediaClient.Listener {
@Override
public void onMetadataUpdated() {
setMetadataFromRemote();
}
@Override
public void onStatusUpdated() {
updatePlaybackState();
}
@Override
public void onSendingRemoteMediaRequest() {
}
@Override
public void onQueueStatusUpdated() {
}
@Override
public void onPreloadStatusUpdated() {
}
}
RemoteMediaClient
を明示的に初期化または登録する必要はありません。
object;フレームワークは自動的にオブジェクトをインスタンス化し、
セッション開始時に基盤となるメディア チャネルが
メディア名前空間をサポートします。
RemoteMediaClient
には、次の getRemoteMediaClient
メソッドとしてアクセスできます。
CastSession
オブジェクト。
CastSession castSession = CastContext.getSharedInstance(mAppContext)
.getSessionManager()
.getCurrentCastSession();
mRemoteMediaClient = castSession.getRemoteMediaClient();
mRemoteMediaClientListener = new CastMediaClientListener();
CCL の代わりに:
VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);
CAF を使用します。
mRemoteMediaClient.addListener(mRemoteMediaClientListener);
RemoteMediaClient
には任意の数のリスナーを登録できます。
これにより、複数の送信コンポーネントが 1 つのインスタンスの
セッションに関連付けられている RemoteMediaClient
。
CCL の VideoCastManager
には、メディア再生を処理するメソッドが用意されています。
VideoCastManager manager = VideoCastManager.getInstance();
if (manager.isRemoteMediaLoaded()) {
manager.pause();
mCurrentPosition = (int) manager.getCurrentMediaPosition();
}
これらは、CAF の RemoteMediaClient によって実装されるようになりました。
if (mRemoteMediaClient.hasMediaSession()) {
mRemoteMediaClient.pause();
mCurrentPosition =
(int)mRemoteMediaClient.getApproximateStreamPosition();
}
CAF では、RemoteMediaClient
に対して発行されたすべてのメディア リクエストに対して
RemoteMediaClient.MediaChannelResult
(PendingResult
コールバック経由)
リクエストの進行状況と最終的な結果を追跡するために使用できます。
CCL と CAF はどちらも、MediaInfo
クラスと MediaMetadata
クラスを使用して
メディア アイテム、メディアの読み込みなど、
CCL でメディアを読み込むには、VideoCastManager
を使用します。
VideoCastManager.getInstance().loadMedia(media, autoPlay, mCurrentPosition, customData);
CAF では、RemoteMediaClient
を使用してメディアを読み込みます。
mRemoteMediaClient.load(media, autoPlay, mCurrentPosition, customData);
現在のメディア セッションの Media
情報とステータスを取得するには、
CCL は VideoCastManager
を使用します。
MediaInfo mediaInfo = VideoCastManager.getInstance()
.getRemoteMediaInformation();
int status = VideoCastManager.getInstance().getPlaybackStatus();
int idleReason = VideoCastManager.getInstance().getIdleReason();
CAF で、RemoteMediaClient
を使用して同じ情報を取得します。
MediaInfo mediaInfo = mRemoteMediaClient.getMediaInfo();
int status = mRemoteMediaClient.getPlayerState();
int idleReason = mRemoteMediaClient.getIdleReason();
案内用のオーバーレイ
CCL と同様に、CAF には、ハイライト表示するカスタムビュー IntroductoryOverlay
が用意されています。
ユーザーに最初に表示されたときにキャスト アイコンを表示する必要があります。
CCL の VideoCastConsumer
onCastAvailabilityChanged
メソッドを使用する代わりに
オーバーレイを表示するタイミングを指定するには、CastStateListener
を宣言して、
キャスト デバイスが検出されると、
MediaRouter
によってローカル ネットワークが作成されます。
private IntroductoryOverlay mIntroductoryOverlay;
private MenuItem mMediaRouteMenuItem;
protected void onCreate(Bundle savedInstanceState) {
...
mCastStateListener = new CastStateListener() {
@Override
public void onCastStateChanged(int newState) {
if (newState != CastState.NO_DEVICES_AVAILABLE) {
showIntroductoryOverlay();
}
}
};
mCastContext = CastContext.getSharedInstance(this);
mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this,
savedInstanceState);
}
protected void onResume() {
mCastContext.addCastStateListener(mCastStateListener);
...
}
protected void onPause() {
mCastContext.removeCastStateListener(mCastStateListener);
...
}
MediaRouteMenuItem
インスタンスを追跡します。
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
mMediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(
getApplicationContext(), menu,
R.id.media_route_menu_item);
showIntroductoryOverlay();
return true;
}
MediaRouteButton
が表示されているかどうかを確認して、導入部のオーバーレイを表示する
表示されます。
private void showIntroductoryOverlay() {
if (mIntroductoryOverlay != null) {
mIntroductoryOverlay.remove();
}
if ((mMediaRouteMenuItem != null) && mMediaRouteMenuItem.isVisible()) {
new Handler().post(new Runnable() {
@Override
public void run() {
mIntroductoryOverlay = new IntroductoryOverlay.Builder(
VideoBrowserActivity.this, mMediaRouteMenuItem)
.setTitleText(getString(R.string.introducing_cast))
.setOverlayColor(R.color.primary)
.setSingleTime()
.setOnOverlayDismissedListener(
new IntroductoryOverlay
.OnOverlayDismissedListener() {
@Override
public void onOverlayDismissed() {
mIntroductoryOverlay = null;
}
})
.build();
mIntroductoryOverlay.show();
}
});
}
}
詳しくは、 サンプルアプリ をご覧ください。
導入オーバーレイのスタイルをカスタマイズする手順は次のとおりです。 導入オーバーレイをカスタマイズする
ミニ コントローラ
CCL の MiniController
ではなく、CAF の MiniControllerFragment
を
mini を表示するアクティビティのアプリ レイアウト ファイル
Controller:
<fragment
android:id="@+id/cast_mini_controller"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:castShowImageThumbnail="true"
android:visibility="gone"
class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" />
CAF は、CCL の MiniController
でサポートされている手動構成をサポートしていません。
また、Autoplay
機能もサポートしていません。
ミニ コントローラのスタイルとボタンをカスタマイズするには、 ミニ コントローラをカスタマイズします。
通知とロック画面
CCL の VideoCastNotificationService
と同様に、CAF では
メディア通知の表示を管理する MediaNotificationService
おすすめします。
マニフェストから以下を削除する必要があります。
VideoIntentReceiver
VideoCastNotificationService
CCL では、カスタム通知サービス
CastConfiguration.Builder
、CAF でサポートされていません。
CCL を使用した次のような CastManager
の初期化について考えてみましょう。
VideoCastManager.initialize(
getApplicationContext(),
new CastConfiguration.Builder(
context.getString(R.string.app_id))
.addNotificationAction(
CastConfiguration.NOTIFICATION_ACTION_PLAY_PAUSE,true)
.addNotificationAction(
CastConfiguration.NOTIFICATION_ACTION_DISCONNECT,true)
.build());
CAF の同等の構成として、SDK には
NotificationsOptions.Builder
: メディア コントロールの作成に役立ちます。
通知とロック画面を送信者アプリに
追加する必要があります通知とロック
画面コントロールは、初期化時に CastOptions
で有効にできます。
CastContext
。
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions =
new NotificationOptions.Builder()
.setActions(Arrays.asList(
MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{0, 1})
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.setCastMediaOptions(mediaOptions)
.build();
}
CAF では通知とロック画面コントロールが常に有効になっています。また
キャスト再生/一時停止ボタンとキャスト停止ボタンがデフォルトで用意されています。CAF
アクティビティの可視性が自動的に追跡され、
メディア通知を表示するタイミング(Gingerbread を除く)
(Gingerbread については、前述の
registerLifecycleCallbacksBeforeIceCreamSandwich()
を使用します。CCL
incrementUiCounter
と decrementUiCounter
の呼び出し VideoCastManager
件
削除する必要があります)。
通知に表示されるボタンをカスタマイズするには、 通知とロック画面にメディア コントロールを追加する
拡張コントローラ
CCL は VideoCastControllerActivity
と VideoCastControllerFragment
を提供します。
メディアのキャスト時に拡張コントローラを表示します。
マニフェストの VideoCastControllerActivity
宣言を削除できます。
CAF では、次のことを行う必要があります。 ExpandControllerActivity を拡張し、キャスト アイコンを追加します。
展開した場所に表示されるスタイルとボタンをカスタマイズするには、 次の手順を踏みます。 拡張コントローラのカスタマイズ
音声フォーカス
CCL と同様に、音声フォーカスは自動的に管理されます。
音量調節
Gingerbread の場合、CCL と同様に dispatchKeyEvent
は必須です。ICS 以降
CCL と CAF の両方の音量調節は自動的に処理されます。
CAF を使用すると、 スマートフォンのアプリ アクティビティに音量バーが表示され、 サポートされているバージョンでキャストできます。CAF では、Cloud KMS 鍵を使用して アプリが前面にない、ロックされている、画面があっても大音量で オフにします。
字幕
Android KitKat 以降では、字幕を使用して字幕をカスタマイズできます。 [設定] は [設定] >ユーザー補助。以前のバージョンの Android では、 この機能はありません。CCL では、これに対処するために、 以前のバージョンの設定と KitKat のシステム設定への委任 以上です。
CAF には、字幕設定を変更するカスタム設定はありません。マイページ
マニフェスト内の CaptionsPreferenceActivity
参照を削除する必要がある
設定 XML を指定します。
クローズされた変数を変更したため、CCL の TracksChooserDialog
は必要なくなりました。
字幕トラックは拡張コントローラ UI によって処理されます。
字幕 API v2 と同様です。
デバッグログ
CAF ではデバッグ ロギングの設定は提供されません。
その他
次の CCL 機能は CAF ではサポートされていません。
MediaAuthService
を提供して再生前に承認を取得する- 構成可能な UI メッセージ
サンプルアプリ
Universal Music Player for Android(uamp)サンプルアプリを CCL から CAF に移行する際の差分をご覧ください。
CAF を使用する Codelab チュートリアルとサンプルアプリもあります。