Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Your app name

Your app name

DroidKaigi 2017

Masaki Ogata

March 09, 2017
Tweet

More Decks by Masaki Ogata

Other Decks in Programming

Transcript

  1. ʮ΋͔ͯ͠͠…ʯ
    ʮԶͨͪ…ʯ
    ʮʮશવରԠ͞Εͯͳ͍ʙʙʂʂʁʁʯʯ
    DroidKaigi 2017 (3/10 14:20~ @Room 3)

    View Slide

  2. View Slide

  3. ࣗݾ঺հ
    Masaki Ogata
    CyberAgent, Inc. / AbemaTV, Inc.
    ogaclejapan
    @ogaclejapan
    New

    View Slide

  4. 2017೥4݄11೔ൃച

    ( ͍ͨͩ·༧໿ड෇த )
    ࢁށໜथɼࡔాߊҰɼࠇ઒༸ɼ౻ా
    ୖຏɼࢁాߤɼాࡔ࿨ெɼ۽୩஌ࢠɼ
    ৿ຊརതɼࡔຊ࿨େɼখܗণथɼླ
    ໦େوɼࢤำါلɹஶ
    B5൑ʗ192ϖʔδ
    ఆՁʢຊମ1,980ԁʴ੫ʣ
    ISBN 978-4-7741-8863-8
    https://goo.gl/Jcy3lJ
    New

    View Slide

  5. View Slide

  6. ࠓ೔ͷΰʔϧ

    View Slide

  7. ࠓ೔ͷΰʔϧ

    View Slide

  8. ΞδΣϯμ
    ֓ཁ ։ൃ ެ։
    • Android TVͱ͸
    • Fire TVͱ͸
    • σβΠϯͱUXΨΠυϥΠϯ

    View Slide

  9. ΞδΣϯμ
    ֓ཁ ։ൃ ެ։
    • جຊʢπʔϧɺϓϩδΣΫτɺetc..ʣ
    • Leanback Support Libraryೖ໳
    • Fire TVͰߟྀ͢Δ΂͖͜ͱ

    View Slide

  10. ΞδΣϯμ
    ֓ཁ ։ൃ ެ։
    • Android TV޲͚ʹΞϓϦΛ഑෍
    • Fire TV޲͚ʹΞϓϦΛ഑෍

    View Slide

  11. ֓ཁ
    • Android TVͱ͸
    • Fire TVͱ͸
    • σβΠϯͱUXΨΠυϥΠϯ

    View Slide

  12. Android TVͱ͸
    Google͕ࣾఏڙ͢ΔTV޲͚ϓϥοτϑΥʔϜ
    • Android 5.0 (Lollipop) ʙ 7.1.1 (Nougat)
    • Google Play StoreʹTV޲͚ΞϓϦΛެ։Մೳ

    (ॳճͷΈ৹ࠪ͋Γ)
    • ੡଄ϝʔΧʔଟ਺

    View Slide

  13. Android TV - ओͳ౥ࡌσόΠε
    Nexus Player
    ʢGoogleʗASUSʣ
    BRAVIA
    ʢSONYʣ
    AQOUS
    ίίϩϏδϣϯ
    ʢSHARPઐ༻ʣ
    Life Stick
    ʢϨΦύϨεઐ༻ʣ
    Air Stick
    ʢCCCʣ
    2015೥2݄ 2015೥10݄ʙ 2016೥6݄ 2016೥7݄ 2016೥12݄
    OS: 7.1.1

    Quad-core

    1GB RAM

    8GB Storage
    OS: 5.1.1

    Dual-core *1

    1.5GB RAM *1

    8GB Storage *1
    OS: 5.1

    Dual-core *1

    2.5GB RAM

    16GB Storage
    -
    OS: 6.0

    Quad-core

    1GB RAM

    8GB Storage
    13,824ԁ 100,000ԁ ʙ 13,380ԁ - 9,800ԁ
    *1: ະެදͷͨΊਪଌ

    View Slide

  14. Android TV - ϗʔϜը໘

    View Slide

  15. Android TV - ϗʔϜը໘

    View Slide

  16. Android TV - ϗʔϜը໘
    Voice Search

    View Slide

  17. Android TV - ϗʔϜը໘
    D-Pad

    View Slide

  18. Android TV - ϗʔϜը໘
    Select

    View Slide

  19. Android TV - ϗʔϜը໘
    Back

    View Slide

  20. Android TV - ϗʔϜը໘
    Play/Pause

    View Slide

  21. Android TV - ϗʔϜը໘
    Home

    View Slide

  22. Android TV - ϗʔϜը໘
    Focus

    View Slide

  23. Android TV - ϗʔϜը໘
    Focus

    View Slide

  24. Android TV - ϗʔϜը໘
    Focus

    View Slide

  25. Android TV - ϗʔϜը໘
    Global Search

    View Slide

  26. Android TV - ϗʔϜը໘
    Recommendation Row

    View Slide

  27. Android TV - ϗʔϜը໘
    Apps and games

    View Slide

  28. Android TV - ϗʔϜը໘
    Settings

    View Slide

  29. ֓ཁ
    • Android TVͱ͸
    • Fire TVͱ͸
    • σβΠϯͱUXΨΠυϥΠϯ

    View Slide

  30. Fire TVͱ͸
    Amazon͕ࣾఏڙ͢ΔTV޲͚ϓϥοτϑΥʔϜ
    • Fire OS 5 (Based on Android 5.1 - API 22)
    • Amazon App StoreʹTV޲͚ΞϓϦΛެ։Մೳ

    (Appleࣾͱಉ͘͡ϦϦʔε͝ͱʹ৹ࠪ͋Γ)
    • ࣗࣾσόΠεͷΈ

    View Slide

  31. Fire TV - ओͳ౥ࡌσόΠε
    Fire TV Stick
    - Gen. 1
    ʢAMAZONʣ
    Fire TV
    - Gen. 2
    ʢAMAZONʣ
    Fire TV Stick
    - Gen. 2
    ʢAMAZONʣ
    2014೥11݄ 2015೥12݄ 2017೥4݄
    Fire OS 5

    Dual-core

    1GB RAM *1

    8GB Storage
    Fire OS 5

    Quad-core

    2GB RAM

    8GB Storage
    Fire OS 5

    Quad-core

    1GB RAM

    8GB Storage
    4,980ԁʗ6,480ԁ 11,980ԁ 4,980ԁ
    *1: 512MB system, 512MB video
    New

    View Slide

  32. Fire TV - ϗʔϜը໘

    View Slide

  33. Fire TV - ϗʔϜը໘

    View Slide

  34. Fire TV - ϗʔϜը໘

    View Slide

  35. Fire TV - ϗʔϜը໘

    View Slide

  36. Fire TV - ϗʔϜը໘
    Menu

    View Slide

  37. Fire TV - ϗʔϜը໘
    Rewind/Fast-forward

    View Slide

  38. ֓ཁ
    • Android TVͱ͸
    • Fire TVͱ͸
    • σβΠϯͱUXΨΠυϥΠϯ

    View Slide

  39. σβΠϯͱUXΨΠυϥΠϯ
    • Designing for Android TV

    https://goo.gl/VWrKs7
    • Android TV Design Guidelines

    https://goo.gl/Z7tSTj
    • Design and User Experience Guidelines

    for Fire TV

    https://goo.gl/ZYgf7D

    View Slide

  40. ։ൃ
    • جຊʢπʔϧɺϓϩδΣΫτɺetc..ʣ
    • Leanback Support Libraryೖ໳
    • Fire TVͰߟྀ͢Δ΂͖͜ͱ

    View Slide

  41. جຊ - ։ൃπʔϧͱSDK
    Android Studio + Android Emulator
    • SDK tools: 24.0.0 or higher
    • Minimum SDK: API 21 (Lollipop) or higher

    View Slide

  42. جຊ - ։ൃπʔϧͱSDK
    ADB over Wi-Fi <—> TVσόΠεʢ࣮ػʣ
    adb connect :5555
    • Using Android Debug Bridge for Android TV

    https://goo.gl/BpSmm0
    • Connecting to Fire TV Through ADB

    https://goo.gl/tEsypE

    View Slide

  43. جຊ - ϓϩδΣΫτઃఆ
    • 320 x 180 px (xhdpi)
    • ΞϓϦ໊Λόφʔը૾಺ʹؚΊΔඞཁ͕͋Δ
    TVΞϓϦ༻ͷόφʔը૾

    View Slide

  44. جຊ - ϓϩδΣΫτઃఆ
    TVΞϓϦ༻ͷόφʔը૾
    ...
    android:banner="@drawable/banner" >
    ...

    View Slide

  45. جຊ - ϓϩδΣΫτઃఆ


    android:required="false" />
    android:required="false" />
    ...

    • Handle Unsupported Hardware Features

    https://goo.gl/u1UU4D

    View Slide

  46. جຊ - ϓϩδΣΫτઃఆ

    android:name="com.example.android.TvActivity"
    ...>


    android:name="android.intent.category.LEANBACK_LAUNCHER" />


    View Slide

  47. جຊ - ϓϩδΣΫτઃఆ
    ͕ɺɺFire TV͸Mobileͱಉ͡ɻ…

    android:name="com.example.amazon.TvActivity"
    ...>


    android:name="android.intent.category.LEANBACK_LAUNCHER" />
    android:name="android.intent.category.LAUNCHER" />


    View Slide

  48. جຊ - ϓϩδΣΫτઃఆ

    Ͳ͏΍ͬͯϓϩδΣΫτΛ෼͚Δ΂͖ʁ

    View Slide

  49. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Mobile
    TV
    app
    Google Play Store
    Amazon App Store
    app
    app

    View Slide

  50. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Good :)
    • ιʔείʔυ͕ҰݩԽͰ͖Δ

    View Slide

  51. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Bad :(
    • ͭͶʹશϓϥοτϑΥʔϜ͕ߋ৽ର৅ͱͳΔ
    • Manifest΍Ϧιʔεͷ؅ཧ͕ΧΦε
    • APKαΠζ͸΍΂ʙ੎͍Ͱ͛͢ʔ૿͑Δ⾭

    View Slide

  52. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Mobile
    TV
    app
    Google Play Store
    Amazon App Store
    app
    app
    app

    View Slide

  53. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Good :)
    • σόΠε͝ͱʹΞϓϦΛߋ৽Ͱ͖Δ
    • Manifest΍Ϧιʔεͷ؅ཧ͸ָνϯ
    • APKαΠζ͸σόΠε͝ͱʹ࠷దԽ

    View Slide

  54. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Bad :(
    • APKΞοϓϩʔυ࣌ʹΦϖϛεͷةݥ͋Γ
    • ར༻Ͱ͖Δόʔδϣϯίʔυͷܻ͕ݮΔ

    View Slide

  55. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    • Multiple APK Support

    https://goo.gl/WuXcvN
    Mobile: v1.0.0(1) -> v1.0.1(2) -> v1.1.0(3) -> …

    TV : v1.0.0(1000001) -> v1.0.1(1000002) -> …
    όʔδϣϯίʔυͷྫʣ

    View Slide

  56. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Mobile
    TV
    app
    Google Play Store
    Amazon App Store
    app2
    app
    app2
    app2

    View Slide

  57. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Good :)
    • ʢMultiple APKͱಉ͡ʣ

    View Slide

  58. جຊ - ϓϩδΣΫτઃఆ
    Single APK Multiple APK Other APK
    Bad :(
    • ϨϏϡʔ΍μ΢ϯϩʔυ਺ͳͲ͕ڞ༗͞Εͳ͍
    • ύοέʔδΛ෼͚ͨ͜ͱʹΑΔ৭ʑͳฐ֐

    ʢΞϓϦ಺՝ۚͳͲʣ

    View Slide

  59. جຊ - ϓϩδΣΫτઃఆ
    Multiple APK͕Αͦ͞͏

    View Slide

  60. جຊ - Focusͷ੍ޚ
    Focus͍ͤͨ͞Viewʹ͸focusableଐੑΛઃఆ

    (ButtonͳͲҰ෦ͷViewͷΈσϑΥϧτͰtrue)
    android:focusable="true"
    android:foreground="@drawable/selector_focus_item"
    >
    ...





    View Slide

  61. جຊ - Focusͷ੍ޚ
    ॳճදࣔͷFocusҐஔʹ͸requestFocusΛઃఆ

    android:focusable="true"/>
    android:focusable="true">


    android:focusable="true"/>

    View Slide

  62. جຊ - Focusͷ੍ޚ
    FocusͷҠಈઌ͕ҙਤ͠ͳ͍ͱ͖͸໌ࣔతʹఆٛ

    (௨ৗ͸FocusFinderʹΑΓࣗಈతʹॲཧ͞ΕΔ)
    ...
    android:nextFocusLeft="@+id/layout1"
    android:nextFocusUp="@+id/layout2"
    android:nextFocusRight="@+id/layout3"
    android:nextFocusDown="@+id/layout4"
    />

    View Slide

  63. جຊ - Focusͷ੍ޚ
    (RecyclerViewͷ৔߹)
    public View focusSearch(View focused, int direction) {
    View result = mLayout.onInterceptFocusSearch(...);
    if (result != null) {
    return result;
    }
    final FocusFinder ff = FocusFinder.getInstance();
    result = ff.findNextFocus(this, focused, direction);
    if (...) {
    eatRequestLayout();
    result = mLayout.onFocusSearchFailed(...);
    resumeRequestLayout(false);
    }
    return result != null ? result : super.focusSearch(...);
    }

    View Slide

  64. جຊ - Focusͷ੍ޚ
    (RecyclerView + CustomLayoutManagerͷ৔߹)
    public View focusSearch(View focused, int direction) {
    View result = mLayout.onInterceptFocusSearch(...);
    if (result != null) {
    return result;
    }
    final FocusFinder ff = FocusFinder.getInstance();
    result = ff.findNextFocus(this, focused, direction);
    if (...) {
    eatRequestLayout();
    result = mLayout.onFocusSearchFailed(...);
    resumeRequestLayout(false);
    }
    return result != null ? result : super.focusSearch(...);
    }

    View Slide

  65. جຊ - Input Eventͷ੍ޚ
    onTouchEventͱಉ͘͡ɺbool஋Λฦ͢
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    boolean handled = false;
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_DOWN:
    case KeyEvent.KEYCODE_DPAD_UP:
    ...
    handled = true;
    break;
    default:
    // no-op
    }
    return handled || super.onKeyDown(keyCode, event);
    }

    View Slide

  66. جຊ - Input Eventͷ੍ޚ
    Button KeyEvent
    Voice Search -
    Select KEYCODE_DPAD_CENTER
    Left KEYCODE_DPAD_LEFT
    Up KEYCODE_DPAD_UP
    Right KEYCODE_DPAD_RIGHT
    Down KEYCODE_DPAD_DOWN
    Back KEYCODE_BACK
    Menu KEYCODE_MENU
    Home -
    Play/Pause KEYCODE_MEDIA_PLAY_PAUSE
    Rewind KEYCODE_MEDIA_REWIND
    Fast Forward KEYCODE_MEDIA_FAST_FORWARD

    View Slide

  67. ։ൃ
    • جຊʢπʔϧɺϓϩδΣΫτɺetc..ʣ
    • Leanback Support Libraryೖ໳
    • Fire TVͰߟྀ͢Δ΂͖͜ͱ

    View Slide

  68. Leanback Support Libraryͱ͸
    Google͕ࣾެࣜʹఏڙ͢ΔϥΠϒϥϦͷ̍ͭͰɺ
    TVΞϓϦ޲͚ʹ࠷దͳUI΢ΟδΣοτͳͲΛఏڙ
    dependencies {
    ...
    compile "com.android.support:leanback-v17:25.2.0"
    }
    <br/><item name="android:colorPrimary">...</item><br/><item name="android:colorPrimaryDark">...</item><br/><item name="android:colorAccent">...</item><br/>

    View Slide

  69. Leanback Support Libraryͷֶͼํ
    • googlesamples/leanback-showcase

    https://goo.gl/99nI2m
    • googlesamples/androidtv-Leanback

    https://goo.gl/3foS5q
    • android/platform_frameworks_support

    https://goo.gl/K90lXi
    GitHub্ͷެࣜαϯϓϧΞϓϦΛίϯύΠϧ͠
    ͯಈ͔ͯ͠ΈΔͷ͕Ұ൪ͷۙಓ

    View Slide

  70. BrowseFragment
    ίϯςϯπΛ୳ͨ͢ΊͷϝΠϯը໘

    View Slide

  71. HeadersFragment RowsFragment
    BrowseFragment

    View Slide

  72. BrowseFragment
    RowsFragment
    HeadersFragment(Hidden)

    View Slide

  73. BrowseFragment
    RowsFragment
    HeadersFragment(Hidden)
    VerticalGridView

    View Slide

  74. BrowseFragment
    RowsFragment
    HeadersFragment(Hidden)
    VerticalGridView
    HorizontalGridView

    View Slide

  75. VerticalGridView / HorizontalGridView

    ͱRecyclerView͸Կ͕ҧ͏ͷʁ
    VerticalGridView gv = ...;
    gv.setNumColumns(1);
    gv.addItemDecoration(new ItemDecoration());
    gv.setAdapter(new Adapter());
    RecyclerView rv = ...;
    rv.setLayoutManager(new GridLayoutManager(this, 1));
    rv.addItemDecoration(new ItemDecoration());
    rv.setAdapter(new Adapter());
    Leanback Support Library - Tips

    View Slide

  76. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  77. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  78. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  79. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  80. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  81. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  82. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  83. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  84. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  85. VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  86. VerticalGridView / HorizontalGridView
    ͸Focus͞ΕͨView͕ՄೳͳݶΓը໘ͷη
    ϯλʔʹදࣔ͞ΕΔ
    VerticalGridView RecyclerView
    ্͔ΒԼ΁ॱ൪ʹFocusΛҠಈͤ͞Δ

    View Slide

  87. DetailsFragment
    ίϯςϯπͷ಺༰Λදࣔ͢Δৄࡉը໘

    View Slide

  88. PlaybackOverlayFragment
    ίϯςϯπΛݟΔͨΊͷϝσΟΞίϯτϩʔϧը໘

    View Slide

  89. Leanback Support Library - Tips
    PresenterʁͳʹͦΕʁඒຯ͍͠ͷʁ
    A Presenter is used to generate Views and bind
    Objects to them on demand. It is closely related to
    the concept of an RecyclerView.Adapter, but is not
    position-based.
    (from API Reference)
    View Presenter
    Object

    (Model)

    View Slide

  90. Leanback Support Library - Tips
    PresenterʁͳʹͦΕʁඒຯ͍͠ͷʁ
    A Presenter is used to generate Views and bind
    Objects to them on demand. It is closely related to
    the concept of an RecyclerView.Adapter, but is not
    position-based.
    (from API Reference)
    View Presenter
    Object

    (Model)
    Model-View-Presenter (MVP)

    View Slide

  91. Leanback Support Library - Tips
    PresenterʁͳʹͦΕʁඒຯ͍͠ͷʁ
    A Presenter is used to generate Views and bind
    Objects to them on demand. It is closely related to
    the concept of an RecyclerView.Adapter, but is not
    position-based.
    (from API Reference)
    View Presenter
    Object

    (Model)
    Model-View-Presenter (MVP)

    RecyclerView with multiple view types

    ΛAdapter͔Β෼཭࣮ͯ͠ݱ͢Δ࢓૊Έ

    View Slide

  92. e.g. RecyclerView with multiple view types
    {
    "ranking_items":[
    {
    "rank":1,
    "title":"foo",
    "image":"http://..."
    },
    {
    "rank":2,
    "title":"bar",
    "image":"http://..."
    },
    ...
    ]
    }
    Rank1 XXXXXXXXXXXXX
    XXXXXXXXXXX…
    XXXXXXX…
    Rank2

    View Slide

  93. public class RankingListAdapter
    extends RecyclerView.Adapter {
    @Override
    public int getItemViewType(int position) {
    RankingItem item = ...;
    return (item.rank == 1) ? LARGE : NORMAL;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,
    int viewType) {
    return (viewType == LARGE)
    ? LargeViewHolder.create(parent)
    : NormalViewHolder.create(parent);
    }
    ...
    e.g. RecyclerView with multiple view types

    View Slide

  94. Presenter LargeRankingItemPresenter
    NormalRankingItemPresenter
    public class NormalRankingItemPresenter extends Presenter {
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent) {
    return NormalViewHolder.create(parent);
    }
    @Override
    public void onBindViewHolder(ViewHolder vh, Object item) {
    RankingItem rankingItem = (RankingItem) item;
    NormalViewHolder viewHolder = NormalViewHolder.of(vh);
    ...
    }
    @Override
    public void onUnbindViewHolder(ViewHolder vh) {}
    static class NormalViewHolder extends Presenter.ViewHolder

    View Slide

  95. PresenterSelector
    public class RankingPresenterSelector extends
    PresenterSelector {
    final LargeRankingItemPresenter largePresenter = ...;
    final NormalRankingItemPresenter normalPresenter = ...;
    final Presenter[] presenters = ...;
    @Override
    public Presenter getPresenter(Object item) {
    RankingItem rankingItem = (RankingItem) item;
    return (rankingItem.rank == 1)
    ? largeRankingItemPresenter
    : normalRankingItemPresenter;
    }
    @Override
    public Presenter[] getPresenters() {
    return presenters;
    }
    }

    View Slide

  96. ObjectAdapter (ArrayObjectAdapter)
    public class RankingFragment extends VerticalGridFragment {
    // Setup VerticalGridPresenter (Column: 1)
    private ArrayObjectAdapter adapter;
    @Override
    protected onViewCreated(...) {
    ...
    PresenterSelector ps = new RankingPresenterSelector();
    adapter = new ArrayObjectAdapter(ps);
    setAdapter(adapter);
    // Load data.
    }
    private onLoaded(List rankingItems) {
    adapter.addAll(0, rankingItems);
    }
    ...

    View Slide

  97. ObjectAdapter (ArrayObjectAdapter)
    public class RankingFragment extends VerticalGridFragment {
    // Setup VerticalGridPresenter (Column: 1)
    private ArrayObjectAdapter adapter;
    @Override
    protected onViewCreated(...) {
    ...
    PresenterSelector ps = new RankingPresenterSelector();
    adapter = new ArrayObjectAdapter(ps);
    setAdapter(adapter);
    // Load data.
    }
    private onLoaded(List rankingItems) {
    adapter.addAll(0, rankingItems);
    }
    ...
    RecyclerView with multiple view types

    ΛAdapter͔Β෼཭࣮ͯ͠ݱ͢Δ࢓૊Έ

    View Slide

  98. Leanback Support Library - Pros & Cons
    • ϝσΟΞ࠶ੜίϯτϩʔϧը໘ͳͲࣗલͰ࡞
    Δඞཁ͕ͳ͍
    • FocusͷϑΟʔυόοΫʢεέʔϦϯά΍ίϯ
    τϥετͳͲʣ͕UI΢ΟδΣοτʹ૊Έࠐ·
    Ε͍ͯΔͷͰɺྑ͠ͳʹ΍ͬͯ͘ΕΔ
    Good :)

    View Slide

  99. Leanback Support Library - Pros & Cons
    Bad :(
    • େ఍ͷσβΠφʔ͞Μ͸LeanbackͷUIͦͷ·
    ·ͰΑ͍ͱ͸ܾͯ͠ݴͬͯ͘Εͳ͍
    • @HideɺPackage Privateɺfinalએݴ͕ඇৗʹ
    ଟ͘ɺΧελϚΠζͷ೉қ౓ߴΊ

    View Slide

  100. Leanback Support Library - Pros & Cons
    Bad :(
    • େ఍ͷσβΠφʔ͞Μ͸LeanbackͷUIͦͷ·
    ·ͰΑ͍ͱ͸ܾͯ͠ݴͬͯ͘Εͳ͍
    • @HideɺPackage Privateɺfinalએݴ͕ඇৗʹ
    ଟ͘ɺΧελϚΠζͷ೉қ౓ߴΊ
    㱺RowsFragmentΛϕʔε͢Δͷ͕͓͢͢Ί

    View Slide

  101. ։ൃ
    • جຊʢπʔϧɺϓϩδΣΫτɺetc..ʣ
    • Leanback Support Libraryೖ໳
    • Fire TVͰߟྀ͢Δ΂͖͜ͱ

    View Slide

  102. FireTVͰߟྀ͢Δ΂͖͜ͱ
    • How Fire TV Development Differs from
    Android TV Development

    https://goo.gl/kvjiaR
    • Can you use Firebase on Amazon Android
    devices?

    https://goo.gl/Y3n4Al
    • Identifying Amazon Fire TV Devices

    https://goo.gl/fkhp4a

    View Slide

  103. ެ։
    • Android TV޲͚ʹΞϓϦΛ഑෍
    • Fire TV޲͚ʹΞϓϦΛ഑෍

    View Slide

  104. Android TV޲͚ʹΞϓϦΛ഑෍
    Google Play Store΁ͷਃ੥ʹඞཁͳ΋ͷ
    • TV޲͚ΨΠυϥΠϯʹద߹ͨ͠ΞϓϦ(.apk)
    • TV༻ͷը૾Ξηοτ
    • εΫϦʔϯγϣοτʢ1ຕҎ্ʣ
    • όφʔը૾ʢ1280 x 720 pxʣ

    View Slide

  105. Android TV޲͚ʹΞϓϦΛ഑෍
    Google Play Store΁ͷਃ੥ʹඞཁͳ΋ͷ
    • TV޲͚ΨΠυϥΠϯʹద߹ͨ͠ΞϓϦ(.apk)
    • TV༻ͷը૾Ξηοτ
    • εΫϦʔϯγϣοτʢ1ຕҎ্ʣ
    • όφʔը૾ʢ1280 x 720 pxʣ

    View Slide

  106. Android TV޲͚ʹΞϓϦΛ഑෍
    Google Play Store΁ͷਃ੥ʹඞཁͳ΋ͷ
    • TV޲͚ΨΠυϥΠϯʹద߹ͨ͠ΞϓϦ(.apk)
    • TV༻ͷը૾Ξηοτ
    • εΫϦʔϯγϣοτʢ1ຕҎ্ʣ
    • όφʔը૾ʢ1280 x 720 pxʣ

    View Slide

  107. Android TV޲͚ʹΞϓϦΛ഑෍
    APKΛϕʔλʗΞϧϑΝʹΞοϓϩʔυ

    View Slide

  108. Android TV޲͚ʹΞϓϦΛ഑෍
    ը૾ΞηοτΛετΞܝࡌ৘ใʹΞοϓϩʔυ

    View Slide

  109. Android TV޲͚ʹΞϓϦΛ഑෍
    Android TV΁ͷ഑৴νΣοΫΛ༗ޮʹߋ৽
    ̍ʙ̎Ӧۀ೔..

    View Slide

  110. Android TV޲͚ʹΞϓϦΛ഑෍

    View Slide

  111. ެ։
    • Android TV޲͚ʹΞϓϦΛ഑෍
    • Fire TV޲͚ʹΞϓϦΛ഑෍

    View Slide

  112. Fire TV޲͚ʹΞϓϦΛ഑෍
    Amazon App Store΁ͷਃ੥ʹඞཁͳ΋ͷ
    • TV޲͚ΨΠυϥΠϯʹద߹ͨ͠ΞϓϦ(.apk)
    • TV༻ͷը૾Ξηοτ(for Gen. 2)
    • εΫϦʔϯγϣοτʢ3ຕҎ্ʣ
    • όφʔը૾ʢ1280 x 720 pxʣ
    • όοΫάϥ΢ϯυը૾ʢ1920 x 1080 pxʣ

    View Slide

  113. Fire TV޲͚ʹΞϓϦΛ഑෍
    Amazon App Store΁ͷਃ੥ʹඞཁͳ΋ͷ
    • TV޲͚ΨΠυϥΠϯʹద߹ͨ͠ΞϓϦ(.apk)
    • TV༻ͷը૾Ξηοτ(for Gen. 2)
    • εΫϦʔϯγϣοτʢ3ຕҎ্ʣ
    • όφʔը૾ʢ1280 x 720 pxʣ
    • όοΫάϥ΢ϯυը૾ʢ1920 x 1080 pxʣ

    View Slide

  114. Fire TV޲͚ʹΞϓϦΛ഑෍
    Amazon App Store΁ͷਃ੥ʹඞཁͳ΋ͷ
    • TV޲͚ΨΠυϥΠϯʹద߹ͨ͠ΞϓϦ(.apk)
    • TV༻ͷը૾Ξηοτ(for Gen. 2)
    • εΫϦʔϯγϣοτʢ3ຕҎ্ʣ
    • όφʔը૾ʢ1280 x 720 pxʣ
    • όοΫάϥ΢ϯυը૾ʢ1920 x 1080 pxʣ

    View Slide

  115. Fire TV޲͚ʹΞϓϦΛ഑෍
    Amazon Developer Console (Dashboard)
    https://developer.amazon.com/home.html

    View Slide

  116. Fire TV޲͚ʹΞϓϦΛ഑෍
    Amazon Developer Console
    Amazon Developer Console (App)

    View Slide

  117. Fire TV޲͚ʹΞϓϦΛ഑෍
    ը૾ΞηοτͱAPKΛΞοϓϩʔυ

    View Slide

  118. Fire TV޲͚ʹΞϓϦΛ഑෍
    ४උ͕੔ͬͨΒਃ੥ͯ͠଴ͭɻ1ʙ5Ӧۀ೔..

    View Slide

  119. Fire TV޲͚ʹΞϓϦΛ഑෍
    LiveʹͳΕ͹ࣗಈతʹެ։

    View Slide

  120. Fire TV޲͚ʹΞϓϦΛ഑෍

    View Slide

  121. • Distribute to Android TV

    https://goo.gl/kViUiV


    TV App Quality

    https://goo.gl/bGdFOi
    • Submitting Your Fire TV App to the Amazon
    Appstore

    https://goo.gl/hDuuDH

    ࢀߟϦϯΫू

    View Slide

  122. View Slide

  123. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ

    View Slide