SlideShare a Scribd company logo
1 of 44
Download to read offline
1
Developing for Android TV and the Nexus Player
Xavier Hallade, Developer Evangelist, Intel Corporation
Google Developer Expert for Android
@ph0b – ph0b.com – +XavierHallade
3
Developing for Android TV and the Nexus Player
• What is Android TV
• How to make your app or game compatible with Android TV
• How to integrate it further
• Publishing your application
• Q&A
4
Android TV and the Nexus Player
6
Android TV and the Nexus Player
• It’s Android
• it’s also Chromecast
• Apps (streaming and others)
• Games (casual and more)
• AOSP compliant
• Leanback Launcher, Google Apps and Play Store
Android TV
7
Nexus Player
• First Android TV device / The only Nexus
• Quad-Core 64bit Intel Silvermont CPU @1.83Ghz
• PowerVR™ Series 6 G6430 GPU - OpenGL ES 3.1
• 64bit, WiFi 802.11ac*
• 1GB ram, 8GB flash, USB-OTG
• 99€, Gamepad sold separately**
• Australia, Austria, Canada, Denmark,
Finland, France, Germany, Italy,
Japan, Norway, Spain, Sweden,
Switzerland, United Kingdom,
United States
* Ethernet can be added using standard USB adapters
** Android TV supports almost any USB/Bluetooth HID Gamepads
8
Other devices
NVIDIA* Shield Razer* Forge TV
Smart TVs from Sony*, Philips*, Sharp*…
9
Demo
10
Demo
11
Adapting your app for Android TV
13
Adapting your app for Android TV
1. Add/reuse a TV-compatible activity that will receive the Leanback intent
2. Integrate TV-specific assets
3. Support non-touchscreen input
4. Adapt the UX of your app
• No need to create a separate Application.
• Still possible to provide an alternative APK for TV.
14
1. The Leanback Intent
<activity android:name=".TvMainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
15
2. The Banner
<activity or <application
…
android:banner="@drawable/ic_banner"
…
>
• Include the localized name of your application
• No transparency
• Size:160x90dp -> 320x180px in drawable-xhdpi
16
3. Supporting non-touchscreen input
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
Adjust D-PAD navigation:
android:focusable="true", <requestFocus /> / .requestFocus()
android:nextFocusDown="@+id/whatever1"
android:nextFocusUp="@id/whatever2"
For custom Views:
KeyEvent.KEYCODE_DPAD_(UP|DOWN|LEFT|RIGHT|CENTER)
17
4. Adapting the UX
Start from android:Theme.NoTitleBar
or Theme.Leanback from the Leanback support library:
compile "com.android.support:leanback-v17:21.0.+"
Add overscan margins to your views: (Leanback Views and Fragments already have these)
android:layout_marginTop="27dp"
android:layout_marginLeft="48dp"
android:layout_marginRight="48dp"
android:layout_marginBottom="27dp"
Leanback support library requires API 17 but you can still support lower API levels:
• Use Theme.Leanback from –v21+ resources, use Leanback classes only from TV-part.
• Set <uses-sdk tools:overrideLibrary="android.support.v17.leanback" />
19
Integrating further with Android TV
Leanback Support library, Recommendations, Search, TV Input
Framework
21
The Leanback support library
22
The Leanback support library – BrowseFragment
BackgroundManager.getInstance()
.setDrawable()
setTitle()
setBadgeDrawable()
setAdapter( ObjectAdapter )
Presented items have to be Rows.
setBrandColor()
setSearchAffordanceColor()
setOnSearchClickedListener()
setOnItemViewSelectedListener()
setOnItemViewClickedListener()
setHeadersState()
24
The Leanback support library – DetailsFragment
detailsOverviewRowPresenter.setBackgroundColor()
detailsOverviewRow.addAction()
detailsOverviewRow.setImageDrawable()
mAdapter.add(new ListRow(header, listRowAdapter))
BackgroundManager.getInstance()
.setDrawable()
25
The Leanback support library – GuidedStepFragment
• GuidanceStylist.Guidance(String title,
String description, String breadcrumb,
Drawable icon)
• onCreateGuidance(Bundle)
• onCreateActions(List, Bundle)
• onGuidedActionClicked(GuidedAction)
26
Recommendation System
Bundle extras = new Bundle();
extras.putString(Notification.EXTRA_BACKGROUND_IMAGE_URI, backgroundUri);
Notification notification = new NotificationCompat.BigPictureStyle(
new NotificationCompat.Builder(mContext)
.setLargeIcon(bitmap)
.setColor(color)
.setContentTitle(title)
.setContentText(description)
.setLocalOnly(true)
.setOngoing(true)
.setCategory(Notification.CATEGORY_RECOMMENDATION)
.setSmallIcon(mSmallIcon)
.setContentIntent(mIntent)
.setExtras(extras))
.build();
It’s advised to update recommendations from a service you can trigger using an AlarmManager
that will run it periodically, starting with shorty after boot.
27
Search System
• Global Search
• Implement a Content Provider
• Declare android.app.searchable meta-data
• https://developer.android.com/training/
tv/discovery/searchable.html
• Search Activity:
• Use SpeechRecognizer
• Can use Leanback SearchFragment.
28
Supporting multiple controllers
• int KeyEvent.getDeviceId()
• String KeyEvent.getDevice().getDescriptor()
API Level 16+
• Nearby Connection API
Google Play Services 7.0+
29
TV Input Framework and Live Channels
31
TV Input Framework and Live Channels
32
Demo
33
Demo
34
TV Input Framework – Live Channels
<service
android:name=".MyTvInputService"
android:permission="android.permission.BIND_TV_INPUT" >
<intent-filter>
<action android:name="android.media.tv.TvInputService" />
</intent-filter>
<meta-data android:name="android.media.tv.input“ android:resource="@xml/my_tv_input" />
</service>
<?xml version="1.0" encoding="utf-8"?>
<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.xh.tvinputservicetest.SettingsActivity"
android:setupActivity="com.xh.tvinputservicetest.SetupActivity" />
my_tv_input.xml
AndroidManifest.xml
public class MyTvInputService extends TvInputService {
…
@Override
public Session onCreateSession(String inputId) {
return new MyTvInputServiceSession(MyTvInputService.this); //ServiceSession implementation is on next slide
}
}
35
TV Input Framework – Live Channels
public class MyTvInputServiceSession extends TvInputService.Session {
Surface mSurface;
@Override
public boolean onSetSurface(Surface surface) {
mSurface = surface;
return true;
}
@Override
public boolean onTune(Uri channelUri) {
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING);
//tune to channel and change draws to surface in a render thread, then fire notifyVideoAvailable()
return true;
}
@Override
public void onSetCaptionEnabled(boolean enabled) { }
…
}
36
Live Channel – Setup and Content upgrade
String inputId = TvContract.buildInputId(new ComponentName(this, TvInputServiceTest.class));
ContentValues channelsValues = new ContentValues();
channelsValues.put(TvContract.Channels.COLUMN_DISPLAY_NAME, "Channel display name");
channelsValues.put(TvContract.Channels.COLUMN_DESCRIPTION, "Channel description");
channelsValues.put(TvContract.Channels.COLUMN_DISPLAY_NUMBER, "1");
channelsValues.put(TvContract.Channels.COLUMN_INPUT_ID, inputId);
channelsValues.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, "internal channel service data");
channelsValues.put(TvContract.Channels.COLUMN_NETWORK_AFFILIATION, "Network Affiliation");
channelsValues.put(TvContract.Channels.COLUMN_ORIGINAL_NETWORK_ID, "Test Network ID");
channelsValues.put(TvContract.Channels.COLUMN_PACKAGE_NAME, "com.xh.tvinputservicetest");
channelsValues.put(TvContract.Channels.COLUMN_SEARCHABLE, true);
channelsValues.put(TvContract.Channels.COLUMN_SERVICE_ID, 123456);
channelsValues.put(TvContract.Channels.COLUMN_SERVICE_TYPE, TvContract.Channels.SERVICE_TYPE_AUDIO_VIDEO);
channelsValues.put(TvContract.Channels.COLUMN_VIDEO_FORMAT, TvContract.Channels.VIDEO_FORMAT_1080P);
channelsValues.put(TvContract.Channels.COLUMN_VERSION_NUMBER, 0);
channelsValues.put(TvContract.Channels.COLUMN_TRANSPORT_STREAM_ID, 0);
channelsValues.put(TvContract.Channels.COLUMN_TYPE, TvContract.Channels.TYPE_OTHER);
Uri channelUri = getContentResolver().insert(TvContract.Channels.CONTENT_URI, channelsValues);
long channelId = ContentUris.parseId(channelUri);
Uri channelLogoUri = TvContract.buildChannelLogoUri(channelId);
AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(channelLogoUri, "rw");
…
37
Live Channel – Programs update
ContentValues programsValues = new ContentValues();
programsValues.put(TvContract.Programs.COLUMN_TITLE, "program title");
programsValues.put(TvContract.Programs.COLUMN_AUDIO_LANGUAGE, "fr");
programsValues.put(TvContract.Programs.COLUMN_BROADCAST_GENRE, "movie/drama"); // ATSC A/65 or Content Descriptor of ETSI EN
300 468,
programsValues.put(TvContract.Programs.COLUMN_CANONICAL_GENRE,
TvContract.Programs.Genres.encode(TvContract.Programs.Genres.DRAMA, TvContract.Programs.Genres.COMEDY));
programsValues.put(TvContract.Programs.COLUMN_CHANNEL_ID, channelId);
programsValues.put(TvContract.Programs.COLUMN_PACKAGE_NAME, "com.xh.tvinputservicetest");
programsValues.put(TvContract.Programs.COLUMN_INTERNAL_PROVIDER_DATA, "internal program service data");
programsValues.put(TvContract.Programs.COLUMN_CONTENT_RATING, TvContentRating.createRating("com.android.tv", "US_TV",
"US_TV_PG", "US_TV_L", "US_TV_D").flattenToString());
programsValues.put(TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS, System.currentTimeMillis() - 3600 * 1000);
programsValues.put(TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS, System.currentTimeMillis() + 3600 * 1000);
programsValues.put(TvContract.Programs.COLUMN_EPISODE_NUMBER, 1);
programsValues.put(TvContract.Programs.COLUMN_SEASON_NUMBER, 3);
programsValues.put(TvContract.Programs.COLUMN_EPISODE_TITLE, "episode title");
programsValues.put(TvContract.Programs.COLUMN_SHORT_DESCRIPTION, "short description");
programsValues.put(TvContract.Programs.COLUMN_LONG_DESCRIPTION, "long description");
programsValues.put(TvContract.Programs.COLUMN_POSTER_ART_URI, );
programsValues.put(TvContract.Programs.COLUMN_THUMBNAIL_URI, );
programsValues.put(TvContract.Programs.COLUMN_VERSION_NUMBER, 0);
programsValues.put(TvContract.Programs.COLUMN_VIDEO_WIDTH, 1920);
programsValues.put(TvContract.Programs.COLUMN_VIDEO_HEIGHT, 1080);
getContentResolver().insert(TvContract.Programs.CONTENT_URI, programsValues);
//TODO: update instead of delete and insert.
38
Publishing apps to the Android TV Play Store
40
Publishing apps to the Android TV Play Store
• Adjust features requirements and meta-data
• Upload your updated/additional APK
• Upload banner and screenshots
• Opt-in for TV distribution
41
Adjusting Feature Requirements and meta-data
Is your app a Game ?
<application … android:isGame="true" …>
Supporting Gamepads ?
<uses-feature android:name="android.hardware.gamepad" android:required="false" />
Supporting only Android TV ?
<uses-feature android:name="android.software.leanback" android:required="true" />
Features you shouldn’t require:
• android.hardware.location.gps, android.hardware.camera.*, android.hardware.telephony,
android.hardware.sensor.*, android.hardware.nfc, android.hardware.touchscreen,
android.hardware.microphone
42
A classic trap: implicitly required features
Having portrait activities declared inside your app ?
Need to specify that your app can be used on hardware that doesn’t support “portrait” mode:
<uses-feature android:name="android.hardware.screen.portrait"
android:required="false" />
Using permissions with implicit hardware requirements ?
The below features aren’t available on every Android TV devices:
• android.hardware.location.gps implied by android.permission.ACCESS_FINE_LOCATION
• android.hardware.camera.autofocus and android.hardware.camera implied
by android.permission.CAMERA
• android.hardware.telephony implied by many telephony-specific permissions
• android.hardware.microphone implied by android.permission.RECORD_AUDIO
43
Submitting your application
1. Check you’re compliant with all the guidelines
2. Upload your APK
3. Upload your banner and a screenshot
4. Opt-in for distribution to the Play Store on Android TV
44
Publishing your TV application as an alternative APK
Switch to Advanced mode before
uploading the second APK.
48
Nexus Player and x86 support from apps?
50
Android* Devices with Intel Inside
(Some of them – there are more than hundred, not all could be listed here)
Motorola*
RAZR i
ZTE* Grand X
IN
Lava* Xolo
X900
Megafon*
Mint
Lenovo*
K800
Orange* San
Diego
2012, 2013…
Lenovo* K900
ASUS Fonepad™
Note FHD - 6”
Samsung* Galaxy™ Tab 3 10.1”
2014… Asus* Zenfones 4/5/6
ASUS* Transformer Pad
TF103CG/TF303CL
Intel® Yolo Acer* Liquid C1
ASUS* MeMO Pad
FHD 10
ASUS* Fonepad™ 7”
Dell* Venue 7/8
KD Interactive
Kurio Tablet
Acer* Iconia Tab 8
/ One 8
Nexus Player
Lenovo* S8
Asus* FonePad 7/8
Lenovo Yoga Tab 2
8/10/13
Tesco Hudl 2
Toshiba
Excite Go
ZTE* Geek
Lenovo*
P90
Asus* Zenfone 2
2015…
Asus* MemoPad 7/8
Nokia n1
Dell* Venue 8 7840 Dell* Venue 10 7040
51
These devices are all fully compatible with ARM* ecosystem
Android* SDK apps
• These will directly work. We’re optimizing the
Runtimes for Intel® platforms.
Android* NDK apps
• Most will run without any recompilation on consumer platforms.
• Android NDK provides an x86 toolchain since 2011
• A simple recompile using the Android NDK yields the best performance
• If there is specific processor dependent code, porting may be
necessary
Android Runtime
Core Libraries
DVM / ART
52
3rd party libraries/engines x86 support
• Game engines/libraries with x86 support:
• Unity: default
• libgdx: default
• NexPlayer SDK: default
• Unreal Engine 3: available
• Marmalade: available
• Cocos2Dx: available
• Havok Anarchy SDK: available
• FMOD: available
• AppGameKit: available
• AppPortable: available
• Adobe Air: available
• … custom NDK code: set NDK variable APP_ABI to ‘all’, inside Application.mk
55
Multiple APKs – clean solution with gradle
splits {
abi {
enable true
reset()
include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
universalApk true
}
}
// map for the version code
project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6,
'x86': 8, 'x86_64': 9]
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.abiFilter, 0) * 1000000 +
android.defaultConfig.versionCode
}
}
56
Uploading Multiple APKs to the store
Switch to Advanced mode before
uploading the second APK.
57
Summary
• Apps submission started only last November:
good opportunity to bring more visibility to your apps and games
• Adding Android TV support isn’t necessarily much work
• No need for maintaining a separate APK
• When targeting the Nexus Player, a better x86 apps compatibility
is nice to have for your apps/libs/engines
58
Q&A
xavier.hallade@intel.com
@ph0b – ph0b.com – +XavierHallade

More Related Content

What's hot

Email authentication using firebase auth + flutter
Email authentication using firebase auth + flutterEmail authentication using firebase auth + flutter
Email authentication using firebase auth + flutterKaty Slemon
 
What is flutter and why should i care?
What is flutter and why should i care?What is flutter and why should i care?
What is flutter and why should i care?Sergi Martínez
 
Webdriver io presentation
Webdriver io presentationWebdriver io presentation
Webdriver io presentationJoão Nabais
 
Android Development: The Basics
Android Development: The BasicsAndroid Development: The Basics
Android Development: The BasicsMike Desjardins
 
Google Firebase
Google FirebaseGoogle Firebase
Google FirebaseAliZaidi94
 
Jetpack Navigation Component
Jetpack Navigation ComponentJetpack Navigation Component
Jetpack Navigation ComponentJames Shvarts
 
Introduction to Flutter
Introduction to FlutterIntroduction to Flutter
Introduction to FlutterApoorv Pandey
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of AndroidTetsuyuki Kobayashi
 
Day: 1 Introduction to Mobile Application Development (in Android)
Day: 1 Introduction to Mobile Application Development (in Android)Day: 1 Introduction to Mobile Application Development (in Android)
Day: 1 Introduction to Mobile Application Development (in Android)Ahsanul Karim
 
Firebase Auth Tutorial
Firebase Auth TutorialFirebase Auth Tutorial
Firebase Auth TutorialBukhori Aqid
 
Mobile DevOps pipeline using Google Flutter
Mobile DevOps pipeline using Google FlutterMobile DevOps pipeline using Google Flutter
Mobile DevOps pipeline using Google FlutterAhmed Abu Eldahab
 
Flutter presentation.pptx
Flutter presentation.pptxFlutter presentation.pptx
Flutter presentation.pptxFalgunSorathiya
 

What's hot (20)

Android Location and Maps
Android Location and MapsAndroid Location and Maps
Android Location and Maps
 
Google Firebase presentation - English
Google Firebase presentation - EnglishGoogle Firebase presentation - English
Google Firebase presentation - English
 
Email authentication using firebase auth + flutter
Email authentication using firebase auth + flutterEmail authentication using firebase auth + flutter
Email authentication using firebase auth + flutter
 
Flutter
FlutterFlutter
Flutter
 
What is flutter and why should i care?
What is flutter and why should i care?What is flutter and why should i care?
What is flutter and why should i care?
 
Webdriver io presentation
Webdriver io presentationWebdriver io presentation
Webdriver io presentation
 
Android Development: The Basics
Android Development: The BasicsAndroid Development: The Basics
Android Development: The Basics
 
Flutter beyond hello world
Flutter beyond hello worldFlutter beyond hello world
Flutter beyond hello world
 
Firebase Overview
Firebase OverviewFirebase Overview
Firebase Overview
 
Google Firebase
Google FirebaseGoogle Firebase
Google Firebase
 
Google Maps in Android
Google Maps in AndroidGoogle Maps in Android
Google Maps in Android
 
Firebase
FirebaseFirebase
Firebase
 
Jetpack Navigation Component
Jetpack Navigation ComponentJetpack Navigation Component
Jetpack Navigation Component
 
Introduction to Flutter
Introduction to FlutterIntroduction to Flutter
Introduction to Flutter
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of Android
 
Day: 1 Introduction to Mobile Application Development (in Android)
Day: 1 Introduction to Mobile Application Development (in Android)Day: 1 Introduction to Mobile Application Development (in Android)
Day: 1 Introduction to Mobile Application Development (in Android)
 
Flutter
FlutterFlutter
Flutter
 
Firebase Auth Tutorial
Firebase Auth TutorialFirebase Auth Tutorial
Firebase Auth Tutorial
 
Mobile DevOps pipeline using Google Flutter
Mobile DevOps pipeline using Google FlutterMobile DevOps pipeline using Google Flutter
Mobile DevOps pipeline using Google Flutter
 
Flutter presentation.pptx
Flutter presentation.pptxFlutter presentation.pptx
Flutter presentation.pptx
 

Viewers also liked

Android tv get started
Android tv get startedAndroid tv get started
Android tv get startedAscii Huang
 
Android TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetupAndroid TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetupRobert Nyman
 
TV design guidelines
TV design guidelinesTV design guidelines
TV design guidelinesYukio Andoh
 
Migrating to Android TV
Migrating to Android TVMigrating to Android TV
Migrating to Android TVDavid Carver
 
Developing Android Applications for Google TV - Android Developer Lab 2011
Developing Android Applications for Google TV - Android Developer Lab 2011Developing Android Applications for Google TV - Android Developer Lab 2011
Developing Android Applications for Google TV - Android Developer Lab 2011Paris Android User Group
 
Designing for Google TV
Designing for Google TVDesigning for Google TV
Designing for Google TVYukio Andoh
 
Google Developers Summit Android TV で実現するリビングルームでのアプリ体験
Google Developers Summit   Android TV で実現するリビングルームでのアプリ体験Google Developers Summit   Android TV で実現するリビングルームでのアプリ体験
Google Developers Summit Android TV で実現するリビングルームでのアプリ体験Takashi EGAWA
 
차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향
차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향
차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향미래웹기술연구소 (MIRAE WEB)
 
Slideshare Powerpoint presentation
Slideshare Powerpoint presentationSlideshare Powerpoint presentation
Slideshare Powerpoint presentationelliehood
 

Viewers also liked (13)

Android tv get started
Android tv get startedAndroid tv get started
Android tv get started
 
Android TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetupAndroid TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetup
 
TV design guidelines
TV design guidelinesTV design guidelines
TV design guidelines
 
Android tv
Android tvAndroid tv
Android tv
 
Working with Android TV - English
Working with Android TV - EnglishWorking with Android TV - English
Working with Android TV - English
 
Migrating to Android TV
Migrating to Android TVMigrating to Android TV
Migrating to Android TV
 
Android TV Overview
Android TV OverviewAndroid TV Overview
Android TV Overview
 
Developing Android Applications for Google TV - Android Developer Lab 2011
Developing Android Applications for Google TV - Android Developer Lab 2011Developing Android Applications for Google TV - Android Developer Lab 2011
Developing Android Applications for Google TV - Android Developer Lab 2011
 
Bees Showreel
Bees ShowreelBees Showreel
Bees Showreel
 
Designing for Google TV
Designing for Google TVDesigning for Google TV
Designing for Google TV
 
Google Developers Summit Android TV で実現するリビングルームでのアプリ体験
Google Developers Summit   Android TV で実現するリビングルームでのアプリ体験Google Developers Summit   Android TV で実現するリビングルームでのアプリ体験
Google Developers Summit Android TV で実現するリビングルームでのアプリ体験
 
차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향
차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향
차세대 모바일 App 기술동향 컨퍼런스 - HTML5와 웹앱 동향
 
Slideshare Powerpoint presentation
Slideshare Powerpoint presentationSlideshare Powerpoint presentation
Slideshare Powerpoint presentation
 

Similar to Getting your app on Android TV

[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV
[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV
[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TVBeMyApp
 
Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...
Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...
Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...Codemotion Tel Aviv
 
Christian Kurzke; Getting Your Content on the Big Screen
Christian Kurzke; Getting Your Content on the Big ScreenChristian Kurzke; Getting Your Content on the Big Screen
Christian Kurzke; Getting Your Content on the Big ScreenDroidcon Berlin
 
[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...
[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...
[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...BeMyApp
 
Using the Presentation API and external screens on Android
Using the Presentation API and external screens on AndroidUsing the Presentation API and external screens on Android
Using the Presentation API and external screens on AndroidXavier Hallade
 
Android Applications Development: A Quick Start Guide
Android Applications Development: A Quick Start GuideAndroid Applications Development: A Quick Start Guide
Android Applications Development: A Quick Start GuideSergii Zhuk
 
March 2014 Meetup - Nokia X Tech Session
March 2014 Meetup - Nokia X Tech SessionMarch 2014 Meetup - Nokia X Tech Session
March 2014 Meetup - Nokia X Tech SessionBlrDroid
 
Mobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 AndroidMobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 AndroidMohammad Shaker
 
Android App development and test environment, Understaing android app structure
Android App development and test environment, Understaing android app structureAndroid App development and test environment, Understaing android app structure
Android App development and test environment, Understaing android app structureVijay Rastogi
 
Lecture 12 - Maps, AR_VR_aaaaHardware.pptx
Lecture 12 - Maps, AR_VR_aaaaHardware.pptxLecture 12 - Maps, AR_VR_aaaaHardware.pptx
Lecture 12 - Maps, AR_VR_aaaaHardware.pptxNgLQun
 
Android Workshop
Android WorkshopAndroid Workshop
Android WorkshopJunda Ong
 
XboxAppDev 4. Web Apps on Xbox
XboxAppDev 4. Web Apps on XboxXboxAppDev 4. Web Apps on Xbox
XboxAppDev 4. Web Apps on XboxWindows Developer
 
Windows 10 UWP Development Overview
Windows 10 UWP Development OverviewWindows 10 UWP Development Overview
Windows 10 UWP Development OverviewDevGAMM Conference
 
The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014
The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014
The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014FalafelSoftware
 
Android Meetup, Илья Лёвин
Android Meetup, Илья ЛёвинAndroid Meetup, Илья Лёвин
Android Meetup, Илья ЛёвинGDG Saint Petersburg
 
Introduction to Android - Mobile Fest Singapore 2009
Introduction to Android - Mobile Fest Singapore 2009Introduction to Android - Mobile Fest Singapore 2009
Introduction to Android - Mobile Fest Singapore 2009sullis
 
Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9Gustavo Fuentes Zurita
 
Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9Gustavo Fuentes Zurita
 
Bring Your Android Apps to BlackBerry 10 in minutes
Bring Your Android Apps to BlackBerry 10 in minutesBring Your Android Apps to BlackBerry 10 in minutes
Bring Your Android Apps to BlackBerry 10 in minutesDr. Ranbijay Kumar
 

Similar to Getting your app on Android TV (20)

[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV
[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV
[Ultracode Munich Meetup #7] Building Apps for Nexus Player & Android TV
 
Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...
Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...
Developing for Android TV and the Nexus player - Mihai Risca & Alexander Wegg...
 
Christian Kurzke; Getting Your Content on the Big Screen
Christian Kurzke; Getting Your Content on the Big ScreenChristian Kurzke; Getting Your Content on the Big Screen
Christian Kurzke; Getting Your Content on the Big Screen
 
[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...
[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...
[Android Codefest] Using the Second-Screen API & Intel® Wireless Display From...
 
Using the Presentation API and external screens on Android
Using the Presentation API and external screens on AndroidUsing the Presentation API and external screens on Android
Using the Presentation API and external screens on Android
 
Android Applications Development: A Quick Start Guide
Android Applications Development: A Quick Start GuideAndroid Applications Development: A Quick Start Guide
Android Applications Development: A Quick Start Guide
 
March 2014 Meetup - Nokia X Tech Session
March 2014 Meetup - Nokia X Tech SessionMarch 2014 Meetup - Nokia X Tech Session
March 2014 Meetup - Nokia X Tech Session
 
Mobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 AndroidMobile Software Engineering Crash Course - C03 Android
Mobile Software Engineering Crash Course - C03 Android
 
Android App development and test environment, Understaing android app structure
Android App development and test environment, Understaing android app structureAndroid App development and test environment, Understaing android app structure
Android App development and test environment, Understaing android app structure
 
Lecture 12 - Maps, AR_VR_aaaaHardware.pptx
Lecture 12 - Maps, AR_VR_aaaaHardware.pptxLecture 12 - Maps, AR_VR_aaaaHardware.pptx
Lecture 12 - Maps, AR_VR_aaaaHardware.pptx
 
Android Workshop
Android WorkshopAndroid Workshop
Android Workshop
 
XboxAppDev 4. Web Apps on Xbox
XboxAppDev 4. Web Apps on XboxXboxAppDev 4. Web Apps on Xbox
XboxAppDev 4. Web Apps on Xbox
 
Windows 10 UWP Development Overview
Windows 10 UWP Development OverviewWindows 10 UWP Development Overview
Windows 10 UWP Development Overview
 
Android part1
Android part1Android part1
Android part1
 
The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014
The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014
The Hitchhicker’s Guide to Windows Azure Mobile Services | FalafelCON 2014
 
Android Meetup, Илья Лёвин
Android Meetup, Илья ЛёвинAndroid Meetup, Илья Лёвин
Android Meetup, Илья Лёвин
 
Introduction to Android - Mobile Fest Singapore 2009
Introduction to Android - Mobile Fest Singapore 2009Introduction to Android - Mobile Fest Singapore 2009
Introduction to Android - Mobile Fest Singapore 2009
 
Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9
 
Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9Androidoscon20080721 1216843094441821-9
Androidoscon20080721 1216843094441821-9
 
Bring Your Android Apps to BlackBerry 10 in minutes
Bring Your Android Apps to BlackBerry 10 in minutesBring Your Android Apps to BlackBerry 10 in minutes
Bring Your Android Apps to BlackBerry 10 in minutes
 

More from Xavier Hallade

BCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUsBCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUsXavier Hallade
 
Apps development for Recon HUDs
Apps development for Recon HUDsApps development for Recon HUDs
Apps development for Recon HUDsXavier Hallade
 
Etendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidEtendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidXavier Hallade
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginXavier Hallade
 
Power optimization for Android apps
Power optimization for Android appsPower optimization for Android apps
Power optimization for Android appsXavier Hallade
 
Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)Xavier Hallade
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel ToolsXavier Hallade
 

More from Xavier Hallade (7)

BCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUsBCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUs
 
Apps development for Recon HUDs
Apps development for Recon HUDsApps development for Recon HUDs
Apps development for Recon HUDs
 
Etendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidEtendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs android
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
 
Power optimization for Android apps
Power optimization for Android appsPower optimization for Android apps
Power optimization for Android apps
 
Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel Tools
 

Recently uploaded

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfonteinmasabamasaba
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...chiefasafspells
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburgmasabamasaba
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...Jittipong Loespradit
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 

Recently uploaded (20)

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 

Getting your app on Android TV

  • 1. 1 Developing for Android TV and the Nexus Player Xavier Hallade, Developer Evangelist, Intel Corporation Google Developer Expert for Android @ph0b – ph0b.com – +XavierHallade
  • 2. 3 Developing for Android TV and the Nexus Player • What is Android TV • How to make your app or game compatible with Android TV • How to integrate it further • Publishing your application • Q&A
  • 3. 4 Android TV and the Nexus Player
  • 4. 6 Android TV and the Nexus Player • It’s Android • it’s also Chromecast • Apps (streaming and others) • Games (casual and more) • AOSP compliant • Leanback Launcher, Google Apps and Play Store Android TV
  • 5. 7 Nexus Player • First Android TV device / The only Nexus • Quad-Core 64bit Intel Silvermont CPU @1.83Ghz • PowerVR™ Series 6 G6430 GPU - OpenGL ES 3.1 • 64bit, WiFi 802.11ac* • 1GB ram, 8GB flash, USB-OTG • 99€, Gamepad sold separately** • Australia, Austria, Canada, Denmark, Finland, France, Germany, Italy, Japan, Norway, Spain, Sweden, Switzerland, United Kingdom, United States * Ethernet can be added using standard USB adapters ** Android TV supports almost any USB/Bluetooth HID Gamepads
  • 6. 8 Other devices NVIDIA* Shield Razer* Forge TV Smart TVs from Sony*, Philips*, Sharp*…
  • 9. 11 Adapting your app for Android TV
  • 10. 13 Adapting your app for Android TV 1. Add/reuse a TV-compatible activity that will receive the Leanback intent 2. Integrate TV-specific assets 3. Support non-touchscreen input 4. Adapt the UX of your app • No need to create a separate Application. • Still possible to provide an alternative APK for TV.
  • 11. 14 1. The Leanback Intent <activity android:name=".TvMainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> </activity>
  • 12. 15 2. The Banner <activity or <application … android:banner="@drawable/ic_banner" … > • Include the localized name of your application • No transparency • Size:160x90dp -> 320x180px in drawable-xhdpi
  • 13. 16 3. Supporting non-touchscreen input <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> Adjust D-PAD navigation: android:focusable="true", <requestFocus /> / .requestFocus() android:nextFocusDown="@+id/whatever1" android:nextFocusUp="@id/whatever2" For custom Views: KeyEvent.KEYCODE_DPAD_(UP|DOWN|LEFT|RIGHT|CENTER)
  • 14. 17 4. Adapting the UX Start from android:Theme.NoTitleBar or Theme.Leanback from the Leanback support library: compile "com.android.support:leanback-v17:21.0.+" Add overscan margins to your views: (Leanback Views and Fragments already have these) android:layout_marginTop="27dp" android:layout_marginLeft="48dp" android:layout_marginRight="48dp" android:layout_marginBottom="27dp" Leanback support library requires API 17 but you can still support lower API levels: • Use Theme.Leanback from –v21+ resources, use Leanback classes only from TV-part. • Set <uses-sdk tools:overrideLibrary="android.support.v17.leanback" />
  • 15. 19 Integrating further with Android TV Leanback Support library, Recommendations, Search, TV Input Framework
  • 17. 22 The Leanback support library – BrowseFragment BackgroundManager.getInstance() .setDrawable() setTitle() setBadgeDrawable() setAdapter( ObjectAdapter ) Presented items have to be Rows. setBrandColor() setSearchAffordanceColor() setOnSearchClickedListener() setOnItemViewSelectedListener() setOnItemViewClickedListener() setHeadersState()
  • 18. 24 The Leanback support library – DetailsFragment detailsOverviewRowPresenter.setBackgroundColor() detailsOverviewRow.addAction() detailsOverviewRow.setImageDrawable() mAdapter.add(new ListRow(header, listRowAdapter)) BackgroundManager.getInstance() .setDrawable()
  • 19. 25 The Leanback support library – GuidedStepFragment • GuidanceStylist.Guidance(String title, String description, String breadcrumb, Drawable icon) • onCreateGuidance(Bundle) • onCreateActions(List, Bundle) • onGuidedActionClicked(GuidedAction)
  • 20. 26 Recommendation System Bundle extras = new Bundle(); extras.putString(Notification.EXTRA_BACKGROUND_IMAGE_URI, backgroundUri); Notification notification = new NotificationCompat.BigPictureStyle( new NotificationCompat.Builder(mContext) .setLargeIcon(bitmap) .setColor(color) .setContentTitle(title) .setContentText(description) .setLocalOnly(true) .setOngoing(true) .setCategory(Notification.CATEGORY_RECOMMENDATION) .setSmallIcon(mSmallIcon) .setContentIntent(mIntent) .setExtras(extras)) .build(); It’s advised to update recommendations from a service you can trigger using an AlarmManager that will run it periodically, starting with shorty after boot.
  • 21. 27 Search System • Global Search • Implement a Content Provider • Declare android.app.searchable meta-data • https://developer.android.com/training/ tv/discovery/searchable.html • Search Activity: • Use SpeechRecognizer • Can use Leanback SearchFragment.
  • 22. 28 Supporting multiple controllers • int KeyEvent.getDeviceId() • String KeyEvent.getDevice().getDescriptor() API Level 16+ • Nearby Connection API Google Play Services 7.0+
  • 23. 29 TV Input Framework and Live Channels
  • 24. 31 TV Input Framework and Live Channels
  • 27. 34 TV Input Framework – Live Channels <service android:name=".MyTvInputService" android:permission="android.permission.BIND_TV_INPUT" > <intent-filter> <action android:name="android.media.tv.TvInputService" /> </intent-filter> <meta-data android:name="android.media.tv.input“ android:resource="@xml/my_tv_input" /> </service> <?xml version="1.0" encoding="utf-8"?> <tv-input xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.xh.tvinputservicetest.SettingsActivity" android:setupActivity="com.xh.tvinputservicetest.SetupActivity" /> my_tv_input.xml AndroidManifest.xml public class MyTvInputService extends TvInputService { … @Override public Session onCreateSession(String inputId) { return new MyTvInputServiceSession(MyTvInputService.this); //ServiceSession implementation is on next slide } }
  • 28. 35 TV Input Framework – Live Channels public class MyTvInputServiceSession extends TvInputService.Session { Surface mSurface; @Override public boolean onSetSurface(Surface surface) { mSurface = surface; return true; } @Override public boolean onTune(Uri channelUri) { notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING); //tune to channel and change draws to surface in a render thread, then fire notifyVideoAvailable() return true; } @Override public void onSetCaptionEnabled(boolean enabled) { } … }
  • 29. 36 Live Channel – Setup and Content upgrade String inputId = TvContract.buildInputId(new ComponentName(this, TvInputServiceTest.class)); ContentValues channelsValues = new ContentValues(); channelsValues.put(TvContract.Channels.COLUMN_DISPLAY_NAME, "Channel display name"); channelsValues.put(TvContract.Channels.COLUMN_DESCRIPTION, "Channel description"); channelsValues.put(TvContract.Channels.COLUMN_DISPLAY_NUMBER, "1"); channelsValues.put(TvContract.Channels.COLUMN_INPUT_ID, inputId); channelsValues.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, "internal channel service data"); channelsValues.put(TvContract.Channels.COLUMN_NETWORK_AFFILIATION, "Network Affiliation"); channelsValues.put(TvContract.Channels.COLUMN_ORIGINAL_NETWORK_ID, "Test Network ID"); channelsValues.put(TvContract.Channels.COLUMN_PACKAGE_NAME, "com.xh.tvinputservicetest"); channelsValues.put(TvContract.Channels.COLUMN_SEARCHABLE, true); channelsValues.put(TvContract.Channels.COLUMN_SERVICE_ID, 123456); channelsValues.put(TvContract.Channels.COLUMN_SERVICE_TYPE, TvContract.Channels.SERVICE_TYPE_AUDIO_VIDEO); channelsValues.put(TvContract.Channels.COLUMN_VIDEO_FORMAT, TvContract.Channels.VIDEO_FORMAT_1080P); channelsValues.put(TvContract.Channels.COLUMN_VERSION_NUMBER, 0); channelsValues.put(TvContract.Channels.COLUMN_TRANSPORT_STREAM_ID, 0); channelsValues.put(TvContract.Channels.COLUMN_TYPE, TvContract.Channels.TYPE_OTHER); Uri channelUri = getContentResolver().insert(TvContract.Channels.CONTENT_URI, channelsValues); long channelId = ContentUris.parseId(channelUri); Uri channelLogoUri = TvContract.buildChannelLogoUri(channelId); AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(channelLogoUri, "rw"); …
  • 30. 37 Live Channel – Programs update ContentValues programsValues = new ContentValues(); programsValues.put(TvContract.Programs.COLUMN_TITLE, "program title"); programsValues.put(TvContract.Programs.COLUMN_AUDIO_LANGUAGE, "fr"); programsValues.put(TvContract.Programs.COLUMN_BROADCAST_GENRE, "movie/drama"); // ATSC A/65 or Content Descriptor of ETSI EN 300 468, programsValues.put(TvContract.Programs.COLUMN_CANONICAL_GENRE, TvContract.Programs.Genres.encode(TvContract.Programs.Genres.DRAMA, TvContract.Programs.Genres.COMEDY)); programsValues.put(TvContract.Programs.COLUMN_CHANNEL_ID, channelId); programsValues.put(TvContract.Programs.COLUMN_PACKAGE_NAME, "com.xh.tvinputservicetest"); programsValues.put(TvContract.Programs.COLUMN_INTERNAL_PROVIDER_DATA, "internal program service data"); programsValues.put(TvContract.Programs.COLUMN_CONTENT_RATING, TvContentRating.createRating("com.android.tv", "US_TV", "US_TV_PG", "US_TV_L", "US_TV_D").flattenToString()); programsValues.put(TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS, System.currentTimeMillis() - 3600 * 1000); programsValues.put(TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS, System.currentTimeMillis() + 3600 * 1000); programsValues.put(TvContract.Programs.COLUMN_EPISODE_NUMBER, 1); programsValues.put(TvContract.Programs.COLUMN_SEASON_NUMBER, 3); programsValues.put(TvContract.Programs.COLUMN_EPISODE_TITLE, "episode title"); programsValues.put(TvContract.Programs.COLUMN_SHORT_DESCRIPTION, "short description"); programsValues.put(TvContract.Programs.COLUMN_LONG_DESCRIPTION, "long description"); programsValues.put(TvContract.Programs.COLUMN_POSTER_ART_URI, ); programsValues.put(TvContract.Programs.COLUMN_THUMBNAIL_URI, ); programsValues.put(TvContract.Programs.COLUMN_VERSION_NUMBER, 0); programsValues.put(TvContract.Programs.COLUMN_VIDEO_WIDTH, 1920); programsValues.put(TvContract.Programs.COLUMN_VIDEO_HEIGHT, 1080); getContentResolver().insert(TvContract.Programs.CONTENT_URI, programsValues); //TODO: update instead of delete and insert.
  • 31. 38 Publishing apps to the Android TV Play Store
  • 32. 40 Publishing apps to the Android TV Play Store • Adjust features requirements and meta-data • Upload your updated/additional APK • Upload banner and screenshots • Opt-in for TV distribution
  • 33. 41 Adjusting Feature Requirements and meta-data Is your app a Game ? <application … android:isGame="true" …> Supporting Gamepads ? <uses-feature android:name="android.hardware.gamepad" android:required="false" /> Supporting only Android TV ? <uses-feature android:name="android.software.leanback" android:required="true" /> Features you shouldn’t require: • android.hardware.location.gps, android.hardware.camera.*, android.hardware.telephony, android.hardware.sensor.*, android.hardware.nfc, android.hardware.touchscreen, android.hardware.microphone
  • 34. 42 A classic trap: implicitly required features Having portrait activities declared inside your app ? Need to specify that your app can be used on hardware that doesn’t support “portrait” mode: <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> Using permissions with implicit hardware requirements ? The below features aren’t available on every Android TV devices: • android.hardware.location.gps implied by android.permission.ACCESS_FINE_LOCATION • android.hardware.camera.autofocus and android.hardware.camera implied by android.permission.CAMERA • android.hardware.telephony implied by many telephony-specific permissions • android.hardware.microphone implied by android.permission.RECORD_AUDIO
  • 35. 43 Submitting your application 1. Check you’re compliant with all the guidelines 2. Upload your APK 3. Upload your banner and a screenshot 4. Opt-in for distribution to the Play Store on Android TV
  • 36. 44 Publishing your TV application as an alternative APK Switch to Advanced mode before uploading the second APK.
  • 37. 48 Nexus Player and x86 support from apps?
  • 38. 50 Android* Devices with Intel Inside (Some of them – there are more than hundred, not all could be listed here) Motorola* RAZR i ZTE* Grand X IN Lava* Xolo X900 Megafon* Mint Lenovo* K800 Orange* San Diego 2012, 2013… Lenovo* K900 ASUS Fonepad™ Note FHD - 6” Samsung* Galaxy™ Tab 3 10.1” 2014… Asus* Zenfones 4/5/6 ASUS* Transformer Pad TF103CG/TF303CL Intel® Yolo Acer* Liquid C1 ASUS* MeMO Pad FHD 10 ASUS* Fonepad™ 7” Dell* Venue 7/8 KD Interactive Kurio Tablet Acer* Iconia Tab 8 / One 8 Nexus Player Lenovo* S8 Asus* FonePad 7/8 Lenovo Yoga Tab 2 8/10/13 Tesco Hudl 2 Toshiba Excite Go ZTE* Geek Lenovo* P90 Asus* Zenfone 2 2015… Asus* MemoPad 7/8 Nokia n1 Dell* Venue 8 7840 Dell* Venue 10 7040
  • 39. 51 These devices are all fully compatible with ARM* ecosystem Android* SDK apps • These will directly work. We’re optimizing the Runtimes for Intel® platforms. Android* NDK apps • Most will run without any recompilation on consumer platforms. • Android NDK provides an x86 toolchain since 2011 • A simple recompile using the Android NDK yields the best performance • If there is specific processor dependent code, porting may be necessary Android Runtime Core Libraries DVM / ART
  • 40. 52 3rd party libraries/engines x86 support • Game engines/libraries with x86 support: • Unity: default • libgdx: default • NexPlayer SDK: default • Unreal Engine 3: available • Marmalade: available • Cocos2Dx: available • Havok Anarchy SDK: available • FMOD: available • AppGameKit: available • AppPortable: available • Adobe Air: available • … custom NDK code: set NDK variable APP_ABI to ‘all’, inside Application.mk
  • 41. 55 Multiple APKs – clean solution with gradle splits { abi { enable true reset() include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' universalApk true } } // map for the version code project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] android.applicationVariants.all { variant -> // assign different version code for each output variant.outputs.each { output -> output.versionCodeOverride = project.ext.versionCodes.get(output.abiFilter, 0) * 1000000 + android.defaultConfig.versionCode } }
  • 42. 56 Uploading Multiple APKs to the store Switch to Advanced mode before uploading the second APK.
  • 43. 57 Summary • Apps submission started only last November: good opportunity to bring more visibility to your apps and games • Adding Android TV support isn’t necessarily much work • No need for maintaining a separate APK • When targeting the Nexus Player, a better x86 apps compatibility is nice to have for your apps/libs/engines