SlideShare a Scribd company logo
1 of 28
Download to read offline
Razvoj Google Chromecast
aplikacija 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
2
2
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 = new
MediaRouteSelector.Builder().addControlCategory(CastMediaControlIntent.categ
oryForCast("YOUR_APPLICATION_ID"))
.build();
Potraga za uređajima 2/2
@Override
protected void onResume() {
super.onResume();
mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
}
19
@Override
protected void onPause() {
if (isFinishing()) {
mMediaRouter.removeCallback(mMediaRouterCallback);
}
super.onPause();
}
Odabir uređaja
private class MyMediaRouterCallback extends MediaRouter.Callback {
@Override
public void onRouteSelected(MediaRouter router, RouteInfo info) {
mSelectedDevice = CastDevice.getFromBundle(info.getExtras());
String routeId = info.getId();
...
}
20
@Override
public 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
@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();
...
• 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);
}
}
• 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?
Kontakti
Branimir Conjar bconjar@realnetworks.com
Krešimir Mišura kmisura@realnetworks.com

More Related Content

Viewers also liked

Viewers also liked (19)

JavaCro'14 - ZeroMQ and Java(Script) – Mladen Čikara
JavaCro'14 - ZeroMQ and Java(Script) – Mladen ČikaraJavaCro'14 - ZeroMQ and Java(Script) – Mladen Čikara
JavaCro'14 - ZeroMQ and Java(Script) – Mladen Čikara
 
JavaCro'14 - JavaScript single-page applications i JEE, can they fit together...
JavaCro'14 - JavaScript single-page applications i JEE, can they fit together...JavaCro'14 - JavaScript single-page applications i JEE, can they fit together...
JavaCro'14 - JavaScript single-page applications i JEE, can they fit together...
 
JavaCro'14 - JCalc Calculations in Java with open source API – Davor Sauer
JavaCro'14 - JCalc Calculations in Java with open source API – Davor SauerJavaCro'14 - JCalc Calculations in Java with open source API – Davor Sauer
JavaCro'14 - JCalc Calculations in Java with open source API – Davor Sauer
 
JavaCro'14 - Sustainability of business performance and best practices – Zlat...
JavaCro'14 - Sustainability of business performance and best practices – Zlat...JavaCro'14 - Sustainability of business performance and best practices – Zlat...
JavaCro'14 - Sustainability of business performance and best practices – Zlat...
 
JavaCro'14 - Going Digital with Java EE - Peter Pilgrim
JavaCro'14 - Going Digital with Java EE - Peter PilgrimJavaCro'14 - Going Digital with Java EE - Peter Pilgrim
JavaCro'14 - Going Digital with Java EE - Peter Pilgrim
 
JavaCro'14 - Take Agile adoption to the next level with Integration Competenc...
JavaCro'14 - Take Agile adoption to the next level with Integration Competenc...JavaCro'14 - Take Agile adoption to the next level with Integration Competenc...
JavaCro'14 - Take Agile adoption to the next level with Integration Competenc...
 
JavaCro'14 - Cloud Platforms in Internet of Things – Krešimir Mišura and Bran...
JavaCro'14 - Cloud Platforms in Internet of Things – Krešimir Mišura and Bran...JavaCro'14 - Cloud Platforms in Internet of Things – Krešimir Mišura and Bran...
JavaCro'14 - Cloud Platforms in Internet of Things – Krešimir Mišura and Bran...
 
JavaCro'14 - Gatling – weapon in ranks of performance testing – Andrija Kranjec
JavaCro'14 - Gatling – weapon in ranks of performance testing – Andrija KranjecJavaCro'14 - Gatling – weapon in ranks of performance testing – Andrija Kranjec
JavaCro'14 - Gatling – weapon in ranks of performance testing – Andrija Kranjec
 
JavaCro'14 - Automatized testing with Selenium 2 – Juraj Ćutić and Aleksander...
JavaCro'14 - Automatized testing with Selenium 2 – Juraj Ćutić and Aleksander...JavaCro'14 - Automatized testing with Selenium 2 – Juraj Ćutić and Aleksander...
JavaCro'14 - Automatized testing with Selenium 2 – Juraj Ćutić and Aleksander...
 
JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin
JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan KljajinJavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin
JavaCro'14 - WebSockets and OpenLayers joined with Spring – Bojan Kljajin
 
JavaCro'14 - Continuous deployment tool – Aleksandar Dostić and Emir Džaferović
JavaCro'14 - Continuous deployment tool – Aleksandar Dostić and Emir DžaferovićJavaCro'14 - Continuous deployment tool – Aleksandar Dostić and Emir Džaferović
JavaCro'14 - Continuous deployment tool – Aleksandar Dostić and Emir Džaferović
 
JavaCro'14 - Vaadin scalability myth – Gordan Ivanović
JavaCro'14 - Vaadin scalability myth – Gordan IvanovićJavaCro'14 - Vaadin scalability myth – Gordan Ivanović
JavaCro'14 - Vaadin scalability myth – Gordan Ivanović
 
JavaCro'14 - WebLogic-GlassFish-JaaS Strategy and Roadmap – Duško Vukmanović
JavaCro'14 - WebLogic-GlassFish-JaaS Strategy and Roadmap – Duško VukmanovićJavaCro'14 - WebLogic-GlassFish-JaaS Strategy and Roadmap – Duško Vukmanović
JavaCro'14 - WebLogic-GlassFish-JaaS Strategy and Roadmap – Duško Vukmanović
 
JavaCro'14 - The World of Java – in Croatia – Branko Mihaljević and Aleksande...
JavaCro'14 - The World of Java – in Croatia – Branko Mihaljević and Aleksande...JavaCro'14 - The World of Java – in Croatia – Branko Mihaljević and Aleksande...
JavaCro'14 - The World of Java – in Croatia – Branko Mihaljević and Aleksande...
 
JavaCro'14 - Profile any environment with Java Flight Recorder – Johan Janssen
JavaCro'14 - Profile any environment with Java Flight Recorder – Johan JanssenJavaCro'14 - Profile any environment with Java Flight Recorder – Johan Janssen
JavaCro'14 - Profile any environment with Java Flight Recorder – Johan Janssen
 
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad PećanacJavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
 
JavaCro'14 - GWT rebooted – Gordan Krešić
JavaCro'14 - GWT rebooted – Gordan KrešićJavaCro'14 - GWT rebooted – Gordan Krešić
JavaCro'14 - GWT rebooted – Gordan Krešić
 
JavaCro'14 - Automatic database migrations – Marko Elezović
JavaCro'14 - Automatic database migrations – Marko ElezovićJavaCro'14 - Automatic database migrations – Marko Elezović
JavaCro'14 - Automatic database migrations – Marko Elezović
 
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
 

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

Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...
Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...
Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...Five
 
Web tehnologije u desktop developmentu
Web tehnologije u desktop developmentuWeb tehnologije u desktop developmentu
Web tehnologije u desktop developmentuDarko Kukovec
 
Zašto nam treba PaaS u Srcu?
Zašto nam treba PaaS u Srcu?Zašto nam treba PaaS u Srcu?
Zašto nam treba PaaS u Srcu?Denis Kranjčec
 
Kako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloudKako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloudDubravko Marak
 
WebUG - Hibridne mobilne aplikacije
WebUG - Hibridne mobilne aplikacijeWebUG - Hibridne mobilne aplikacije
WebUG - Hibridne mobilne aplikacijeMatija Šmalcelj
 
FSEC2011: Reverzni inzenjering Android aplikacija
FSEC2011: Reverzni inzenjering Android aplikacijaFSEC2011: Reverzni inzenjering Android aplikacija
FSEC2011: Reverzni inzenjering Android aplikacijaDinko Korunic
 

Similar to JavaCro'14 - Developing Google Chromecast applications on Android – Branimir Conjar and Krešimir Mišura (9)

Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...
Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...
Razvoj aplikacija za Google Chromecast - Branimir Conjar, Matija Kovačić, Kre...
 
JavaCro'15 - Integration of Mobile Applications with Facebook - Krešimir Mišu...
JavaCro'15 - Integration of Mobile Applications with Facebook - Krešimir Mišu...JavaCro'15 - Integration of Mobile Applications with Facebook - Krešimir Mišu...
JavaCro'15 - Integration of Mobile Applications with Facebook - Krešimir Mišu...
 
Web tehnologije u desktop developmentu
Web tehnologije u desktop developmentuWeb tehnologije u desktop developmentu
Web tehnologije u desktop developmentu
 
Zašto nam treba PaaS u Srcu?
Zašto nam treba PaaS u Srcu?Zašto nam treba PaaS u Srcu?
Zašto nam treba PaaS u Srcu?
 
Kako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloudKako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloud
 
WebUG - Hibridne mobilne aplikacije
WebUG - Hibridne mobilne aplikacijeWebUG - Hibridne mobilne aplikacije
WebUG - Hibridne mobilne aplikacije
 
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan VučakJavantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
 
FSEC2011-Dinko
FSEC2011-DinkoFSEC2011-Dinko
FSEC2011-Dinko
 
FSEC2011: Reverzni inzenjering Android aplikacija
FSEC2011: Reverzni inzenjering Android aplikacijaFSEC2011: Reverzni inzenjering Android aplikacija
FSEC2011: Reverzni inzenjering Android aplikacija
 

More from HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association

More from HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association (20)

Java cro'21 the best tools for java developers in 2021 - hujak
Java cro'21   the best tools for java developers in 2021 - hujakJava cro'21   the best tools for java developers in 2021 - hujak
Java cro'21 the best tools for java developers in 2021 - hujak
 
JavaCro'21 - Java is Here To Stay - HUJAK Keynote
JavaCro'21 - Java is Here To Stay - HUJAK KeynoteJavaCro'21 - Java is Here To Stay - HUJAK Keynote
JavaCro'21 - Java is Here To Stay - HUJAK Keynote
 
Javantura v7 - Behaviour Driven Development with Cucumber - Ivan Lozić
Javantura v7 - Behaviour Driven Development with Cucumber - Ivan LozićJavantura v7 - Behaviour Driven Development with Cucumber - Ivan Lozić
Javantura v7 - Behaviour Driven Development with Cucumber - Ivan Lozić
 
Javantura v7 - The State of Java - Today and Tomowwow - HUJAK's Community Key...
Javantura v7 - The State of Java - Today and Tomowwow - HUJAK's Community Key...Javantura v7 - The State of Java - Today and Tomowwow - HUJAK's Community Key...
Javantura v7 - The State of Java - Today and Tomowwow - HUJAK's Community Key...
 
Javantura v7 - Learning to Scale Yourself: The Journey from Coder to Leader -...
Javantura v7 - Learning to Scale Yourself: The Journey from Coder to Leader -...Javantura v7 - Learning to Scale Yourself: The Journey from Coder to Leader -...
Javantura v7 - Learning to Scale Yourself: The Journey from Coder to Leader -...
 
JavaCro'19 - The State of Java and Software Development in Croatia - Communit...
JavaCro'19 - The State of Java and Software Development in Croatia - Communit...JavaCro'19 - The State of Java and Software Development in Croatia - Communit...
JavaCro'19 - The State of Java and Software Development in Croatia - Communit...
 
Javantura v6 - Java in Croatia and HUJAK - Branko Mihaljević, Aleksander Radovan
Javantura v6 - Java in Croatia and HUJAK - Branko Mihaljević, Aleksander RadovanJavantura v6 - Java in Croatia and HUJAK - Branko Mihaljević, Aleksander Radovan
Javantura v6 - Java in Croatia and HUJAK - Branko Mihaljević, Aleksander Radovan
 
Javantura v6 - On the Aspects of Polyglot Programming and Memory Management i...
Javantura v6 - On the Aspects of Polyglot Programming and Memory Management i...Javantura v6 - On the Aspects of Polyglot Programming and Memory Management i...
Javantura v6 - On the Aspects of Polyglot Programming and Memory Management i...
 
Javantura v6 - Case Study: Marketplace App with Java and Hyperledger Fabric -...
Javantura v6 - Case Study: Marketplace App with Java and Hyperledger Fabric -...Javantura v6 - Case Study: Marketplace App with Java and Hyperledger Fabric -...
Javantura v6 - Case Study: Marketplace App with Java and Hyperledger Fabric -...
 
Javantura v6 - How to help customers report bugs accurately - Miroslav Čerkez...
Javantura v6 - How to help customers report bugs accurately - Miroslav Čerkez...Javantura v6 - How to help customers report bugs accurately - Miroslav Čerkez...
Javantura v6 - How to help customers report bugs accurately - Miroslav Čerkez...
 
Javantura v6 - When remote work really works - the secrets behind successful ...
Javantura v6 - When remote work really works - the secrets behind successful ...Javantura v6 - When remote work really works - the secrets behind successful ...
Javantura v6 - When remote work really works - the secrets behind successful ...
 
Javantura v6 - Kotlin-Java Interop - Matej Vidaković
Javantura v6 - Kotlin-Java Interop - Matej VidakovićJavantura v6 - Kotlin-Java Interop - Matej Vidaković
Javantura v6 - Kotlin-Java Interop - Matej Vidaković
 
Javantura v6 - Spring HATEOAS hypermedia-driven web services, and clients tha...
Javantura v6 - Spring HATEOAS hypermedia-driven web services, and clients tha...Javantura v6 - Spring HATEOAS hypermedia-driven web services, and clients tha...
Javantura v6 - Spring HATEOAS hypermedia-driven web services, and clients tha...
 
Javantura v6 - End to End Continuous Delivery of Microservices for Kubernetes...
Javantura v6 - End to End Continuous Delivery of Microservices for Kubernetes...Javantura v6 - End to End Continuous Delivery of Microservices for Kubernetes...
Javantura v6 - End to End Continuous Delivery of Microservices for Kubernetes...
 
Javantura v6 - Istio Service Mesh - The magic between your microservices - Ma...
Javantura v6 - Istio Service Mesh - The magic between your microservices - Ma...Javantura v6 - Istio Service Mesh - The magic between your microservices - Ma...
Javantura v6 - Istio Service Mesh - The magic between your microservices - Ma...
 
Javantura v6 - How can you improve the quality of your application - Ioannis ...
Javantura v6 - How can you improve the quality of your application - Ioannis ...Javantura v6 - How can you improve the quality of your application - Ioannis ...
Javantura v6 - How can you improve the quality of your application - Ioannis ...
 
Javantura v6 - Just say it v2 - Pavao Varela Petrac
Javantura v6 - Just say it v2 - Pavao Varela PetracJavantura v6 - Just say it v2 - Pavao Varela Petrac
Javantura v6 - Just say it v2 - Pavao Varela Petrac
 
Javantura v6 - Automation of web apps testing - Hrvoje Ruhek
Javantura v6 - Automation of web apps testing - Hrvoje RuhekJavantura v6 - Automation of web apps testing - Hrvoje Ruhek
Javantura v6 - Automation of web apps testing - Hrvoje Ruhek
 
Javantura v6 - Master the Concepts Behind the Java 10 Challenges and Eliminat...
Javantura v6 - Master the Concepts Behind the Java 10 Challenges and Eliminat...Javantura v6 - Master the Concepts Behind the Java 10 Challenges and Eliminat...
Javantura v6 - Master the Concepts Behind the Java 10 Challenges and Eliminat...
 
Javantura v6 - Building IoT Middleware with Microservices - Mario Kusek
Javantura v6 - Building IoT Middleware with Microservices - Mario KusekJavantura v6 - Building IoT Middleware with Microservices - Mario Kusek
Javantura v6 - Building IoT Middleware with Microservices - Mario Kusek
 

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

  • 1. Razvoj Google Chromecast aplikacija za Androidaplikacija za Android Branimir Conjar Krešimir Mišura
  • 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
  • 5. Kako funkcionira? 5 Preuzeto s https://developers.google.com/cast/
  • 6. • 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
  • 7. • Slike • BMP • GIF • JPEG • PNG • WEBP Tehničke specifikacije 2/2 • WEBP • Audio • HE-AAC • LC-AAC • CELT/Opus • MP3 • Vorbis 7 RealNetworks Confidential
  • 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
  • 9. Razvoj Android sender aplikacije 9
  • 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
  • 12. Stanja sender aplikacije 1/2 Prvo otkrivanje 12 Nema otkrivenih receivera Receiveri prisutni
  • 13. Stanja sender aplikacije 2/2 Casting u tijeku 13 Sesija uspostavljena Casting u tijeku - player
  • 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();
  • 19. Potraga za uređajima 2/2 @Override protected void onResume() { super.onResume(); mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); } 19 @Override protected void onPause() { if (isFinishing()) { mMediaRouter.removeCallback(mMediaRouterCallback); } super.onPause(); }
  • 20. Odabir uređaja private class MyMediaRouterCallback extends MediaRouter.Callback { @Override public void onRouteSelected(MediaRouter router, RouteInfo info) { mSelectedDevice = CastDevice.getFromBundle(info.getExtras()); String routeId = info.getId(); ... } 20 @Override public void onRouteUnselected(MediaRouter router, RouteInfo info) { teardown(); mSelectedDevice = null; } }
  • 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
  • 25. 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; }
  • 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