Implementando um Android Sender

Transcrição

Implementando um Android Sender
Chromecast
Seu aplicativo na TV
Ivan de Aguirre
@IvAguirre
[email protected]
Cast
Sender:
Sender:
Android, iOS,
Chrome App
Sender:
Android, iOS,
Chrome App
Receiver:
Sender:
Android, iOS,
Chrome App
Receiver:
HTML5
Workflow
Workflow
•
Descobrir o Chromecast.
Workflow
•
•
Descobrir o Chromecast.
Definir CC como a Rota.
Workflow
•
•
•
Descobrir o Chromecast.
Definir CC como a Rota.
Iniciar uma Sessão (session ID).
Workflow
•
•
•
•
Descobrir o Chromecast.
Definir CC como a Rota.
Iniciar uma Sessão (session ID).
CC carrega o Receiver (app ID).
•
Envio de
mensagens ao
CC através de
um Canal.
•
•
Envio de
mensagens ao
CC através de
um Canal.
Callbacks.
O que enviar para o Receiver pelos Canais?
O que enviar para o Receiver pelos Canais?
Texto (Custom Channel)
O que enviar para o Receiver pelos Canais?
Texto (Custom Channel)
URL e Metadados: Fotos, Vídeos, etc.
(Media Chanel)
Posso enviar conteúdo diretamente
pelo Media Channel?
Posso enviar conteúdo diretamente
pelo Media Channel?
Precisa iniciar um Web Server no
Dispositivo :/
Antes de tudo…
Antes de tudo…
developers.google.com/cast
Antes de tudo…
developers.google.com/cast
User Experience Guidelines
Antes de tudo…
developers.google.com/cast
User Experience Guidelines
Design Checklist
Implementando um Android Sender
Implementando um Android Sender
com.android.support:appcompat-v7:20.+
Implementando um Android Sender
com.android.support:appcompat-v7:20.+
Implementando um Android Sender
com.android.support:appcompat-v7:20.+
com.android.support:mediarouter-v7:20.+
Implementando um Android Sender
com.android.support:appcompat-v7:20.+
com.android.support:mediarouter-v7:20.+
Implementando um Android Sender
com.android.support:appcompat-v7:20.+
com.android.support:mediarouter-v7:20.+
com.google.android.gms:play-services:+
Implementando um Android Sender
Implementando um Android Sender
•
Botão de Cast na Action Bar.
Implementando um Android Sender
•
Botão de Cast na Action Bar.
•
Media Router API e Google Services API: Callbacks, Callbacks everywhere!!
Implementando um Android Sender
•
Botão de Cast na Action Bar.
•
Media Router API e Google Services API: Callbacks, Callbacks everywhere!!
•
Gerenciar estado da Sessão. Ex.: recriação da Activity, destruição da
Activity, kill do processo, oscilações na conexão Wifi, etc..
Implementando um Android Sender
•
Botão de Cast na Action Bar.
•
Media Router API e Google Services API: Callbacks, Callbacks everywhere!!
•
Gerenciar estado da Sessão. Ex.: recriação da Activity, destruição da
Activity, kill do processo, oscilações na conexão Wifi, etc..
•
Dica 1: se for uma Activity só mantenha os objetos pertinentes em um
Fragment com setRetainInstance(true).
Implementando um Android Sender
•
Botão de Cast na Action Bar.
•
Media Router API e Google Services API: Callbacks, Callbacks everywhere!!
•
Gerenciar estado da Sessão. Ex.: recriação da Activity, destruição da
Activity, kill do processo, oscilações na conexão Wifi, etc..
•
Dica 1: se for uma Activity só mantenha os objetos pertinentes em um
Fragment com setRetainInstance(true).
•
Dica 2: várias Activity use um Foreground Service ou um Objeto com dados
static.
Implementando um Android Sender
•
Botão de Cast na Action Bar.
•
Media Router API e Google Services API: Callbacks, Callbacks everywhere!!
•
Gerenciar estado da Sessão. Ex.: recriação da Activity, destruição da
Activity, kill do processo, oscilações na conexão Wifi, etc..
•
Dica 1: se for uma Activity só mantenha os objetos pertinentes em um
Fragment com setRetainInstance(true).
•
Dica 2: várias Activity use um Foreground Service ou um Objeto com dados
static.
Implementando um Android Sender
•
Botão de Cast na Action Bar.
•
Media Router API e Google Services API: Callbacks, Callbacks everywhere!!
•
Gerenciar estado da Sessão. Ex.: recriação da Activity, destruição da
Activity, kill do processo, oscilações na conexão Wifi, etc..
•
Dica 1: se for uma Activity só mantenha os objetos pertinentes em um
Fragment com setRetainInstance(true).
•
Dica 2: várias Activity use um Foreground Service ou um Objeto com dados
static.
github.com/googlecast/CastCompanionLibrary-android
CastCompanionLibrary Ex
!
private VideoCastManager mVideoCastMgr;!
!
protected void onCreate(Bundle !
savedState){!
(…)
!
!
mVideoCastMgr.reconnectSessionIfPossible(!
this, true, 5 /*seconds*/);!
}!
!
CastCompanionLibrary Ex
DbxChooser.Result result = new DbxChooser.Result(data);!
Uri link = result.getLink();!
!
MediaMetadata mediaMetadata =!
new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);!
mediaMetadata.putString(MediaMetadata.KEY_TITLE, !
result.getName());!
mediaMetadata.putString(MediaMetadata.KEY_SUBTITLE,!
"Some text");!
(…)!
MediaInfo mediaInfo = new MediaInfo.Builder(link.toString())!
.setContentType("video/mp4")!
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)!
.setMetadata(mediaMetadata)!
.build();!
!
mVideoCastMgr!
.startCastControllerActivity(this, mediaInfo, 0, true);!
Receiver
Receiver
•
Default Receiver
Receiver
•
Default Receiver
•
Styled Media Receiver
Receiver
•
Default Receiver
•
Styled Media Receiver
•
Custom Receiver
Receiver
•
Default Receiver
•
Styled Media Receiver
•
Custom Receiver
•
cast.google.com/publish
Styled Receiver
Custom Receiver
<html>!
<head>!
<title>Example minimum receiver</title>!
<script src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/
cast_receiver.js"></script>!
</head>!
<body>!
<video id='media'/>!
<script>!
window.onload = function() {!
window.mediaElement = document.getElementById('media');!
window.mediaManager = new !
cast.receiver.MediaManager(window.mediaElement);!
window.castReceiverManager = !
cast.receiver.CastReceiverManager.getInstance();!
window.castReceiverManager.start();!
}!
</script>!
</body>!
Mirror & Presentation
Mirror
Mirror
Presentation
Presentation
•
É preciso estar em Mirror.
Presentation
•
É preciso estar em Mirror.
•
Layout exibido somente na
tela de Mirror.
class DemoPresentation extends Presentation
{!
!
public DemoPresentation(Context context, !
Display display) {!
super(context, display);!
}!
!
@Override!
protected void onCreate(Bundle savedState{!
super.onCreate(savedInstanceState);!
setContentView(R.layout.test_secondary);!
(…)!
}
RouteInfo route = mMediaRouter.getSelectedRoute(!
MediaRouter.ROUTE_TYPE_LIVE_VIDEO);!
Display presentationDisplay =!
route != null ? route.getPresentationDisplay() : null;!
!
if (mPresentation != null!
&& mPresentation.getDisplay() != presentationDisplay) {!
mPresentation.dismiss();!
mPresentation = null;!
}!
!
if (mPresentation == null && presentationDisplay != null) {!
mPresentation = new DemoPresentation(this, !
presentationDisplay);!
mPresentation.setOnDismissListener(mOnDismissListener);!
try {!
mPresentation.show();!
} catch (WindowManager.InvalidDisplayException ex){!
Log.w(TAG, "Display was removed.", ex);!
mPresentation = null;!
}!
}
Lembrando…
iOS
Google Chrome
Mãos à Obra!!
developers.google.com/cast
github.com/googlecast
github.com/ivan-aguirre/chromecast_samples
Comunidade G+: Google Cast Developers
Obrigado!!
@IvAguirre
[email protected]
Cast your question :)

Documentos relacionados