Transcript
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]


Top Related