JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir...
-
Upload
hujak-hrvatska-udruga-java-korisnika-croatian-java-user-association -
Category
Technology
-
view
1.012 -
download
3
description
Transcript of JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir...
Razvoj Google Chromecastaplikacija za Androidaplikacija za Android
Branimir Conjar 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
Ukratko o Chromecastu
3
• 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
Kako funkcionira?
5
Preuzeto s https://developers.google.com/cast/
• 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
• Slike• BMP• GIF• JPEG• PNG• WEBP
Tehničke specifikacije 2/2
• WEBP
• Audio• HE-AAC• LC-AAC• CELT/Opus• MP3• Vorbis
7 RealNetworks Confidential
• 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
Razvoj Android sender aplikacije
9
• 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
• 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
Stanja sender aplikacije 1/2
Prvo otkrivanje
12
Nema otkrivenih
receivera
Receiveri prisutni
Stanja sender aplikacije 2/2
Casting u tijeku
13
Sesija uspostavljena Casting u tijeku -player
• 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
• 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" />
• 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
• 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
• 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();
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();
}
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;
}}
• 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();
• 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();...
• 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);
}}
• 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
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;}
• 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
Hvala na pozornosti!Pitanja?