Chromecast is a thumb-sized media streaming device that plugs into the HDMI port on your TV. Set it up with a simple mobile app, then send your favorite online shows, movies, music and more to your TV using your smartphone, tablet or laptop. The presentation will first give a quick introduction to Chromecast and similar products, after which the main focus will be on adding Chromecast support for Android applications using ChromecastSDK. This includes going through every step of the process in code, from starting media discovery to find potential Chromecast devices all the way to disconnecting from an existing session. Experiences from integrating Chromecast on RealPlayer Cloud, first app in the world to support casting of local items, will be presented in the end.
2. Razvoj Android sender aplikacije
Ukratko o Chromecastu
• Što je Google Chromecast?
• Kako funkcionira?
• Tehničke specifikacije
• Kako postati developer?
Razvoj Android sender aplikacije
• UX smjernice
• Dizajn
• Priprema razvojne okoline
• Razvoj aplikacije
2
2
4. • Chromecast je jeftini media streaming adapter koji
pretvara bilo koji TV uređaj s HDMI priključkom u app-
driven smart TV kada ga se upari s mobitelom,
tabletom ili stolnim računalnom.
• Slika na TV-u, upravljanje s drugim uređajem
Što je Google Chromecast?
• Slika na TV-u, upravljanje s drugim uređajem
• Komponente
• Sender aplikacija
• Receiver aplikacija
• Izvor sadržaja
4
8. • Kako do uređaja?
• Prijava na Google Cast Developer Console
(https://cast.google.com/publish/#/signup)
• Prijava receiver aplikacije – osim ako se koristi
default media receiver
Kako postati developer?
default media receiver
• Prijava Chromecast uređaja
• Serijski broj
• Omogućuje development i debugging
8
Više na https://developers.google.com/cast/docs/registration
10. • Cast user model:
• Mobilni uređaj – sender koji upravlja sadržajem
• TV – receiver koji prikazuje sadržaj
• Oslanjanje na koordinaciju između dva ekrana
• Pravila:
UX smjernice
• Pravila:
• Receiver što jednostavniji – ograničenja samog uređaja
• Sva interakcija kroz sender aplikaciju
• Portret orijentacija preferirana
• Brzina jako bitna – u što kraćem roku prikazati sadržaj na
velikom ekranu – Cast gumb prisutan svuda
10
Više na https://developers.google.com/cast/docs/ux_guidelines
11. • Jako bitna stavka – pokriveni svi slučajevi korištenja
• Početni ekran kod prvog otkrivanja receivera
• Posebno bitan prikaz svih stanja sender aplikacije
1. Nema otkrivenog receivera
Dizajn
2. Receiver otkriven
3. Sesija s receiverom uspostavljena
4. Casting u tijeku
• Dizajn lock i notification ekrana
11
14. • Potrebne stvari:
• Najnovija verzija Android SDK – Android SDK Manager
• Android support libraries – Android SDK Manager
• Verzija 19.0.1+
• Google Play Services SDK – Android SDK Manager
Priprema razvojne okoline
• Google Play Services SDK – Android SDK Manager
• Verzija 4.2+
• Dependencies – moraju biti dodani kao projekti:
• android-support-v7-appcompat
• android-support-v7-mediarouter
• google-play-services_lib
14
15. • Android manifest zahtijeva sljedeću konfiguraciju:
Razvoj aplikacije
<uses-sdk android:minSdkVersion="9"
android:targetSdkVersion="19" />
<meta-data
• Ovisno o verziji SDK-a treba prilagoditi temu
15
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
16. • Sender započne potragu za uređajima
• Svaki uređaj predstavljen rutom kad se pritisne gumb
• MediaRouter obavijesti sender aplikaciju koju rutu je korisnik
odabrao
• Sender iz rute dohvati instancu CastDevice objekta
• Sender stvori GoogleApiClienta (GAC)
Tipičan slijed sender aplikacije
• Sender stvori GoogleApiClienta (GAC)
• Sender spoji GAC, a SDK potvrdi da je spojen
• Sender pokrene receiver aplikaciju, SDK potvrdi da je aplikacija
pokrenuta
• Sender stvori komunikacijski kanal preko kojeg šalje razne
poruke
• Sender zatvori komunikacijski kanal i sesiju
16
17. • Prema UX smjernicama, aplikacija mora podržavati uvijek
vidljivi Cast gumb
• Postoje tri načina da se to ostvari:
1. Koristiti MediaRouter ActionBar provider:
android.support.v7.app.MediaRouteActionProvider
Dodavanje Cast gumba
android.support.v7.app.MediaRouteActionProvider
2. Koristiti MediaRouter Cast gumb:
android.support.v7.app.MediaRouteButton
3. Koristiti custom UI i MediaRouter API – metoda koju
smo mi koristili
17
18. • Aplikacija najprije mora dohvatiti referencu
MediaRoutera i držati ju kroz cijeli životni vijek
• MediaRouter filtrira uređaje na temelju receiver APP_ID
Potraga za uređajima 1/2
mMediaRouter = MediaRouter.getInstance(getApplicationContext());
• MediaRouter filtrira uređaje na temelju receiver APP_ID
18
mMediaRouteSelector = new
MediaRouteSelector.Builder().addControlCategory(CastMediaControlIntent.categ
oryForCast("YOUR_APPLICATION_ID"))
.build();
21. • Jednom kada je ruta odabrana i kada imamo instancu
CastDevica, možemo pokrenuti receiver aplikaciju
Povezivanje s receiver aplikacijom
Cast.CastOptions.Builder apiOptionsBuilder = Cast.CastOptions
.builder(mSelectedDevice, mCastClientListener);
mApiClient = new GoogleApiClient.Builder(this)
.addApi(Cast.API, apiOptionsBuilder.build())
• Sender aplikacija mora deklarirati razne callback
metode kako bi znala status konekcije
21
.addApi(Cast.API, apiOptionsBuilder.build())
.addConnectionCallbacks(mConnectionCallbacks)
.addOnConnectionFailedListener(mConnectionFailedListener)
.build();
mApiclient.connect();
22. • Jednom kada dobijemo potvrdu da smo spojeni na
receiver, možemo pokrenuti aplikaciju
Pokretanje receiver aplikacije
@Override
public void onConnected(Bundle connectionHint) {
if (mWaitingForReconnect) {
mWaitingForReconnect = false;
reconnectChannels();
} else {
try {
22
try {
Cast.CastApi.launchApplication(mApiClient, "YOUR_APPLICATION_ID", false)
.setResultCallback(
new ResultCallback<Cast.ApplicationConnectionResult>() {
@Override
public void onResult(Cast.ApplicationConnectionResult result) {
Status status = result.getStatus();
if (status.isSuccess()) {
ApplicationMetadata applicationMetadata =
result.getApplicationMetadata();
String sessionId = result.getSessionId();
String applicationStatus = result.getApplicationStatus();
boolean wasLaunched = result.getWasLaunched();
...
23. • Sva komunikacija odvija se kroz posebne kanale
• Koristi se za slanje poruka u obliku Stringa
• Svaki kanal ima jedinstveni namespace – mora počinjati
prefixom urn:x-cast
Komunikacija s receiver aplikacijom
23
class HelloWorldChannel implements Cast.MessageReceivedCallback {
public String getNamespace() {
return "urn:x-cast:com.example.custom";
}
@Override
public void onMessageReceived(CastDevice castDevice, String namespace,
String message) {
Log.d(TAG, "onMessageReceived: " + message);
}
}
24. • Google Cast SDK podržava Media kanal za
prikazivanje multimedije
• Ima dobro poznati namespace: urn:x-
cast:com.google.cast.media
• Za korištenje ovog kanala potrebna je instanca
Komunikacija Media kanalom
• Za korištenje ovog kanala potrebna je instanca
RemoteMediaPlayera pomoću kojeg se sve odvija
• sve što se tiče RealPlayer Cloud playback dijela ide
preko ovog kanala
• Posebni kanali za Subtitles i SpeedTest
24
26. • Par open source aplikacija na GitHubu
(https://github.com/googlecast)
• Uključuju:
• Hello World
• Video player aplikaciju
Sample aplikacije
• Video player aplikaciju
• Companion Library projekt koji se može koristiti u postojećim
aplikacijama za dodavanje Chromecast podrške
• Android SDK sadrži dvije sample aplikacije (<SDK install
location>/extras/google/google_play_services/samples/cast/)
• Preporučljivo ih je isprobati kako bi bili sigurni da je razvojna
okolina spremna
26