Integrando sua app Android com Chromecast

104
Integrando sua app Android com Chromecast Athila Santos [email protected]

description

Palestra ministrada no segundo Mobile Day Ci&T, ocorrido em 27/09/2014

Transcript of Integrando sua app Android com Chromecast

Page 1: Integrando sua app Android com Chromecast

Integrando sua app Android com Chromecast

Athila [email protected]

Page 2: Integrando sua app Android com Chromecast

Formado em Engenharia da Computação pela Universidade Federal de Itajubá em 2007. Trabalho com desenvolvimento Mobile desde então e com Android desde 2009 (Android 1.5)

26

Page 3: Integrando sua app Android com Chromecast

Ready to cast!

Page 4: Integrando sua app Android com Chromecast

Cast device

Page 5: Integrando sua app Android com Chromecast

Cast device

Provedor de conteúdo

Page 6: Integrando sua app Android com Chromecast

Cast device

Renderizador

Provedor de conteúdo

Page 7: Integrando sua app Android com Chromecast

Cast device

Renderizador

Controle

Provedor de conteúdo

Page 8: Integrando sua app Android com Chromecast

Cast devices no mercado

Page 9: Integrando sua app Android com Chromecast

Amazon Fire TV

Roku 3 Apple TV Google Chromecast

Processador Quad core Dual core Single core Single core

Memória 2 GB 512 MB 512 MB 512 MB

ControleComando por voz; controle

físico

Controle físico; app iOS

disponível

Controle físico; app iOS

Controlado por app (iOS, Android, Chrome)

HDMI SIM SIM SIM SIM

Preço $99 $99 $99 $35

Page 10: Integrando sua app Android com Chromecast

● Sender app

Chromecast: Requisitos

Page 11: Integrando sua app Android com Chromecast

● Sender app

Chromecast: Requisitos

Page 12: Integrando sua app Android com Chromecast

● Receiver app

● Sender app

Chromecast: Requisitos

Page 13: Integrando sua app Android com Chromecast

● Receiver app

● Sender app

Chromecast: Requisitos

Page 14: Integrando sua app Android com Chromecast

● Receiver app

Default Receiver (pronto para uso)

● Sender app

Chromecast: Requisitos

Page 15: Integrando sua app Android com Chromecast

Styled Media Receiver

● Receiver app

Default Receiver (pronto para uso)

Custom Receiver

● Sender app

Chromecast: Requisitos

Page 16: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 17: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 18: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 19: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 20: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 21: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 22: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 23: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 24: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 25: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 26: Integrando sua app Android com Chromecast

Chromecast: Requisitos

Page 27: Integrando sua app Android com Chromecast

Styled Media Receiver

● Receiver app

Default Receiver (pronto para uso)

Custom Receiver

● Sender app

Chromecast: Requisitos

Page 28: Integrando sua app Android com Chromecast

Styled Media Receiver

● Receiver app

Default Receiver (pronto para uso)

Custom Receiver

● Sender app

Chromecast: Requisitos

Web browser limitado!

Page 29: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

Page 30: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

Page 31: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

Page 32: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

App ID

Page 33: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

App ID

App ID

Page 34: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

App ID

App ID

URL

Page 35: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

App ID

App ID

URL

URL

Page 36: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

App ID

App ID

URL

URL

HTML

Page 37: Integrando sua app Android com Chromecast

Chromecast: Application lifecycle

App ID

App ID

URL

URL

HTML

Canal de dados

Page 38: Integrando sua app Android com Chromecast

The sender app

Page 39: Integrando sua app Android com Chromecast

Sender app: Dependências

 

 

 

Page 40: Integrando sua app Android com Chromecast

Sender app: Dependências

● Android Support Library v7

 

 

Page 41: Integrando sua app Android com Chromecast

Sender app: Dependências

● Android Support Library v7

● Android Support Media Router

Library

 

Page 42: Integrando sua app Android com Chromecast

Sender app: Dependências

● Android Support Library v7

● Android Support Media Router

Library

● Google Play Services

Page 43: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 44: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 45: Integrando sua app Android com Chromecast

Sender app: Descoberta de dispositivos

Page 46: Integrando sua app Android com Chromecast

Sender app: Descoberta de dispositivos

Page 47: Integrando sua app Android com Chromecast

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" >

<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"/></menu>

Sender app: Descoberta de dispositivos

Page 48: Integrando sua app Android com Chromecast

Descoberta de dispositivos: Media Router Selector

Page 49: Integrando sua app Android com Chromecast

Descoberta de dispositivos: Media Router Selector

public class MediaRouterPlaybackActivity extends ActionBarActivity { private MediaRouteSelector mSelector;

@Override protected void onCreate(Bundle savedInstanceState) { (...) // Create a route selector for the type of routes your app supports. mSelector = new MediaRouteSelector.Builder() // These are the framework-supported intents .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO) .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO) .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) .build();

(...) }}

Page 50: Integrando sua app Android com Chromecast

Descoberta de dispositivos: Media Router Selector

public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu);

// Inflate the menu and configure the media router action provider. getMenuInflater().inflate(R.menu.sample_media_router_menu, menu);

// Attach the MediaRouteSelector to the menu item MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item); MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem); mediaRouteActionProvider.setRouteSelector(mSelector);

// Return true to show the menu. return true;}

Page 51: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 52: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 53: Integrando sua app Android com Chromecast

Gerenciamento de sessão: Media Router Callback

private final MediaRouter.Callback mMediaRouterCallback = new MediaRouter.Callback() {

@Override public void onRouteSelected(MediaRouter router, RouteInfo route) { }

@Override public void onRouteUnselected(MediaRouter router, RouteInfo route) { }

@Override public void onRoutePresentationDisplayChanged(MediaRouter router, RouteInfo route) { }}

Page 54: Integrando sua app Android com Chromecast

Gerenciamento de sessão: Media Router Callback

public class MediaRouterPlaybackActivity extends ActionBarActivity { protected void onCreate(Bundle savedInstanceState) { mMediaRouter = MediaRouter.getInstance(this); }

public void onStart() { mMediaRouter.addCallback(mSelector, mMediaRouterCallback,

MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); }

public void onStop() { mMediaRouter.removeCallback(mMediaRouterCallback); super.onStop(); }}

Page 55: Integrando sua app Android com Chromecast

Gerenciamento de sessão: Media Router Callback

public class MediaRouterPlaybackActivity extends ActionBarActivity { protected void onCreate(Bundle savedInstanceState) { mMediaRouter = MediaRouter.getInstance(this); }

public void onStart() { mMediaRouter.addCallback(mSelector, mMediaRouterCallback,

MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); }

public void onStop() { mMediaRouter.removeCallback(mMediaRouterCallback); super.onStop(); }}

Page 56: Integrando sua app Android com Chromecast

Gerenciamento de sessão: Media Router Callback

public class MediaRouterPlaybackActivity extends ActionBarActivity { protected void onCreate(Bundle savedInstanceState) { mMediaRouter = MediaRouter.getInstance(this); }

public void onStart() { mMediaRouter.addCallback(mSelector, mMediaRouterCallback,

MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); }

public void onStop() { mMediaRouter.removeCallback(mMediaRouterCallback); super.onStop(); }}

Page 57: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 58: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 59: Integrando sua app Android com Chromecast

Sender app: Os passos para o sucesso...

1. Descoberta de dispositivos

2. Gerenciamento de sessão

3. Transimissão de dados

Page 60: Integrando sua app Android com Chromecast

Transmissão de dados: Mensagem genérica

Cast.CastApi.sendMessage (com.google.android.gms.common.api.GoogleApiClient, NAMESPACE, message)

.setResultCallback (new ResultCallback<Status>() {

@Overridepublic void onResult(Status result) {

if (!result.isSuccess()) { Log.e(TAG, "Sending message failed"); }}});

Page 61: Integrando sua app Android com Chromecast

Transmissão de dados: Remote playback

protected void onCreate(Bundle savedInstanceState) { Bundle mediaInfo = new Bundle(); mediaInfo.putString(MediaMetadata.KEY_TITLE, "Big Buck Bunny"); mediaInfo.putString(MediaMetadata.KEY_SUBTITLE, "Blender Foundation"); mediaInfo.putString(MediaMetadata.KEY_STUDIO, "Fusce id nisi turpis. Praesent viverra bibendum semper. Donec tristique, orci");

(...)}

Page 62: Integrando sua app Android com Chromecast

Transmissão de dados: Remote playback

public void onRouteSelected(MediaRouter router, RouteInfo route) { mRemotePlaybackClient = new RemotePlaybackClient(this, route); mRemotePlaybackClient.play(Uri.parse("http://meu_video.mp4"), "video/mp4", mediaInfo, 0, null, new ItemActionCallback() {

@Override public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus, String itemId, MediaItemStatus itemStatus) { logStatus("play: succeeded for item " + itemId); } @Override public void onError(String error, int code, Bundle data) { } });}

Page 63: Integrando sua app Android com Chromecast

Google Cast User Guidelines

Page 64: Integrando sua app Android com Chromecast

Google Cast User Guidelines

https://developers.google.com/cast/docs/design_checklist#sender

Page 65: Integrando sua app Android com Chromecast
Page 66: Integrando sua app Android com Chromecast
Page 67: Integrando sua app Android com Chromecast

CastCompanionLibrary - Registrando receiver app

public class CastApplication extends Application { private static VideoCastManager mCastMgr = null;

public static VideoCastManager getCastManager(Context context) { if (null == mCastMgr) { mCastMgr = VideoCastManager.initialize(context, APPLICATION_ID, null, null); } mCastMgr.setContext(context); return mCastMgr; }}

Page 68: Integrando sua app Android com Chromecast

CastCompanionLibrary - Registrando receiver app

public class CastApplication extends Application { private static VideoCastManager mCastMgr = null;

public static VideoCastManager getCastManager(Context context) { if (null == mCastMgr) { mCastMgr = VideoCastManager.initialize(context, APPLICATION_ID, null, null); } mCastMgr.setContext(context); return mCastMgr; }} Default Receiver App:

CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID

Page 69: Integrando sua app Android com Chromecast

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" >

<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"/></menu>

Sender app: Descoberta de dispositivos

Page 70: Integrando sua app Android com Chromecast

CastCompanionLibrary - Descoberta de devices

public class PlayerActivity extends ActionBarActivity { private VideoCastManager mCastManager; private MediaInfo mSelectedMedia; private VideoCastConsumerImpl mCastConsumer;

protected void onCreate(Bundle savedInstanceState) { mCastManager = CastApplication.getCastManager(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.main, menu); mCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item); return true; }}

Page 71: Integrando sua app Android com Chromecast

CastCompanionLibrary - Gerenciando sessãoprotected void onCreate(Bundle savedInstanceState) { mCastConsumer = new VideoCastConsumerImpl() { public void onApplicationConnected(ApplicationMetadata appMetadata, String sessionId, boolean wasLaunched) { } public void onApplicationDisconnected(int errorCode) { } public void onDisconnected() { } public void onRemoteMediaPlayerMetadataUpdated() { } public void onFailed(int resourceId, int statusCode) { } public void onConnectionSuspended(int cause) { } public void onConnectivityRecovered() { } }; }protected void onResume() { super.onResume(); mCastManager.addVideoCastConsumer(mCastConsumer); }

Page 72: Integrando sua app Android com Chromecast

protected void onCreate(Bundle savedInstanceState) { Bundle mediaInfo = new Bundle(); mediaInfo.putString(MediaMetadata.KEY_TITLE, "Big Buck Bunny"); mediaInfo.putString(MediaMetadata.KEY_SUBTITLE, "Blender Foundation"); mediaInfo.putString(MediaMetadata.KEY_STUDIO, "Fusce id nisi turpis. Praesent viverra bibendum semper. Donec tristique, orci"); mediaInfo.putString(com.google.sample.castcompanionlibrary.utils.Utils.KEY_URL, http://url.mp4); mediaInfo.putString(com.google.sample.castcompanionlibrary.utils.Utils.KEY_CONTENT_TYPE, "video/mp4"); ArrayList<String> images = new ArrayList<String>(); images.add("http://image_url_480"); images.add("http://image_url_720"); mediaInfo.putStringArrayList(com.google.sample.castcompanionlibrary.utils.Utils.KEY_IMAGES, images); mSelectedMediaInfo = com.google.sample.castcompanionlibrary.utils.Utils.toMediaInfo(mediaInfo);}

CastCompanionLibrary - Reproduzindo vídeo remoto

Page 73: Integrando sua app Android com Chromecast

mediaInfo.putString(MediaMetadata.KEY_TITLE, "Big Buck Bunny");

CastCompanionLibrary - Reproduzindo vídeo remoto

Page 74: Integrando sua app Android com Chromecast

mediaInfo.putString(MediaMetadata.KEY_TITLE, "Big Buck Bunny");

CastCompanionLibrary - Reproduzindo vídeo remoto

Page 75: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

mediaInfo.putString(MediaMetadata.KEY_SUBTITLE, "Blender Foundation");

Page 76: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

mediaInfo.putString(MediaMetadata.KEY_SUBTITLE, "Blender Foundation");

Page 77: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

mediaInfo.putString(MediaMetadata.KEY_STUDIO, "Fusce id nisi turpis. Praesent viverra bibendum semper. Donec tristique, orci");

Page 78: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

mediaInfo.putString(MediaMetadata.KEY_STUDIO, "Fusce id nisi turpis. Praesent viverra bibendum semper. Donec tristique, orci");

Page 79: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

images.add("http://image_url_480");

Page 80: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

images.add("http://image_url_480");

Page 81: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

public void onApplicationConnected(ApplicationMetadata appMetadata, String sessionId, boolean wasLaunched) { if (null != mSelectedMedia) { mCastManager.startCastControllerActivity(this, mSelectedMedia, 0, true); finish(); return; }}

Page 82: Integrando sua app Android com Chromecast

CastCompanionLibrary - Reproduzindo vídeo remoto

Page 83: Integrando sua app Android com Chromecast

Brindes da CCL

Page 84: Integrando sua app Android com Chromecast

CastControllerActivity

Page 85: Integrando sua app Android com Chromecast

CCL - CastControllerActivity

Page 86: Integrando sua app Android com Chromecast

CCL - CastControllerActivity

Page 87: Integrando sua app Android com Chromecast

CCL - CastControllerActivity

images.add("http://image_url_720");

Page 88: Integrando sua app Android com Chromecast

CCL - CastControllerActivity

<activity android:name="com.google.sample.castcompanionlibrary.cast.player.VideoCastControllerActivity" android:launchMode="singleTask" android:screenOrientation="portrait" android:theme="@style/Theme.CastVideoOverlayYellow" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="<parentActivity>" />

<intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity>

Page 89: Integrando sua app Android com Chromecast

MiniController

Page 90: Integrando sua app Android com Chromecast

CCL - MiniController

Page 91: Integrando sua app Android com Chromecast

CCL - MiniController

Page 92: Integrando sua app Android com Chromecast

CCL - MiniController

<com.google.sample.castcompanionlibrary.widgets.MiniController android:id="@+id/miniController1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:visibility="gone" > </com.google.sample.castcompanionlibrary.widgets.MiniController>

Page 93: Integrando sua app Android com Chromecast

CCL - MiniController

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

// -- Adding MiniController mMini = (MiniController) findViewById(R.id.miniController1); mCastManager.addMiniController(mMini);}protected void onDestroy() { if (null != mCastManager) { mCastManager.removeMiniController(mMini); } super.onDestroy();}

Page 94: Integrando sua app Android com Chromecast

OnGoing Notification

Page 95: Integrando sua app Android com Chromecast

CCL - OnGoing Notification

Page 96: Integrando sua app Android com Chromecast

CCL - OnGoing Notification

Page 97: Integrando sua app Android com Chromecast

CCL - OnGoing Notification<receiver android:name="com.google.sample.castcompanionlibrary.remotecontrol.VideoIntentReceiver" > <intent-filter> <action android:name="com.google.sample.castcompanionlibrary.action.toggleplayback" /> <action android:name="com.google.sample.castcompanionlibrary.action.stop" /> </intent-filter></receiver>

<service android:name="com.google.sample.castcompanionlibrary.notification.VideoCastNotificationService" android:exported="false" > <intent-filter> <action android:name="com.google.sample.castcompanionlibrary.action.toggleplayback" /> <action android:name="com.google.sample.castcompanionlibrary.action.stop" /> <action android:name="com.google.sample.castcompanionlibrary.action.notificationvisibility" /> </intent-filter></service>

Page 98: Integrando sua app Android com Chromecast

CCL - OnGoing Notificationprotected void onResume() { mCastManager = CastApplication.getCastManager(this); mCastManager.incrementUiCounter();}protected void onPause() { mCastManager.decrementUiCounter();}

public class CastApplication extends Application { private static VideoCastManager mCastMgr = null;

public static VideoCastManager getCastManager(Context context) { mCastMgr = VideoCastManager.initialize(context, APPLICATION_ID, null, null); mCastMgr.enableFeatures(VideoCastManager.FEATURE_NOTIFICATION ); return mCastMgr; }}

Page 99: Integrando sua app Android com Chromecast

Lock Screen

Page 100: Integrando sua app Android com Chromecast

CCL - Lock Screen

Page 101: Integrando sua app Android com Chromecast

CCL - LockScreen

public class CastApplication extends Application { private static VideoCastManager mCastMgr = null;

public static VideoCastManager getCastManager(Context context) { mCastMgr = VideoCastManager.initialize(context, APPLICATION_ID, null, null); mCastMgr.enableFeatures(VideoCastManager.FEATURE_NOTIFICATION | VideoCastManager.FEATURE_LOCKSCREEN); return mCastMgr; }}

Page 102: Integrando sua app Android com Chromecast
Page 103: Integrando sua app Android com Chromecast

CCL RULES!!!!!