28
Razvoj Google Chromecast aplikacija za Android Branimir Conjar Krešimir Mišura

JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Razvoj Google Chromecastaplikacija za Androidaplikacija za Android

Branimir Conjar Krešimir Mišura

Page 2: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

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

22

Page 3: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Ukratko o Chromecastu

3

Page 4: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 5: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Kako funkcionira?

5

Preuzeto s https://developers.google.com/cast/

Page 6: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• Hardware

• 2 x 1.2 Ghz

• 512 MB

• 2 GB flash storage

Tehničke specifikacije 1/2

• Podržani formati

• Video

• MP4, WebM

• MPEG-DASH, SmoothStreaming, HTTP Live Streaming

• Kodeci: H.264 High Profile Level 4.1, 4.2 and 5, VP8

6

Page 7: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• Slike• BMP• GIF• JPEG• PNG• WEBP

Tehničke specifikacije 2/2

• WEBP

• Audio• HE-AAC• LC-AAC• CELT/Opus• MP3• Vorbis

7 RealNetworks Confidential

Page 8: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 9: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Razvoj Android sender aplikacije

9

Page 10: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 11: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 12: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Stanja sender aplikacije 1/2

Prvo otkrivanje

12

Nema otkrivenih

receivera

Receiveri prisutni

Page 13: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Stanja sender aplikacije 2/2

Casting u tijeku

13

Sesija uspostavljena Casting u tijeku -player

Page 14: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 15: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

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

Page 16: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 17: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 18: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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 = newMediaRouteSelector.Builder().addControlCategory(CastMediaControlIntent.categoryForCast("YOUR_APPLICATION_ID"))

.build();

Page 19: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Potraga za uređajima 2/2

@Overrideprotected void onResume() {super.onResume();mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,

MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);}

19

@Overrideprotected void onPause() {if (isFinishing()) {mMediaRouter.removeCallback(mMediaRouterCallback);

}super.onPause();

}

Page 20: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Odabir uređaja

private class MyMediaRouterCallback extends MediaRouter.Callback {

@Overridepublic void onRouteSelected(MediaRouter router, RouteInfo info) {mSelectedDevice = CastDevice.getFromBundle(info.getExtras());String routeId = info.getId();...

}

20

@Overridepublic void onRouteUnselected(MediaRouter router, RouteInfo info) {teardown();mSelectedDevice = null;

}}

Page 21: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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();

Page 22: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• Jednom kada dobijemo potvrdu da smo spojeni na receiver, možemo pokrenuti aplikaciju

Pokretanje receiver aplikacije

@Overridepublic 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>() {@Overridepublic 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();...

Page 23: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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";}

@Overridepublic void onMessageReceived(CastDevice castDevice, String namespace,

String message) {Log.d(TAG, "onMessageReceived: " + message);

}}

Page 24: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 25: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Zatvaranje kanala i sesije

private void teardown() {if (mApiClient != null) {if (mApplicationStarted) {if (mApiClient.isConnected()) {try {Cast.CastApi.stopApplication(mApiClient, mSessionId);if (mHelloWorldChannel != null) {Cast.CastApi.removeMessageReceivedCallbacks(mApiClient,mHelloWorldChannel.getNamespace());

mHelloWorldChannel = null;

25

mHelloWorldChannel = null;}

} catch (IOException e) {Log.e(TAG, "Exception while removing channel", e);

}mApiClient.disconnect();

}mApplicationStarted = false;

}mApiClient = null;

}mSelectedDevice = null;mWaitingForReconnect = false;}

Page 26: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

• 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

Page 27: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Hvala na pozornosti!Pitanja?

Page 28: JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura

Kontakti

Branimir Conjar [email protected]

Krešimir Mišura [email protected]