æè¡é¨ã®æ¾å°¾(@Kazu_cocoa)ã§ãã
ã¯ãã¯ãããã§ã¯ã2å¹´ç¨åããAndroid TVã«å¯¾ãã¦ã¢ããªããªãªã¼ã¹ãã¦ãã¾ãã以åãCookpad Android TV Appã®ãã¶ã¤ã³ã§èãããã¨ã«ã¦è§¦ãããããã¨ãããã¾ãã

ã¿ãªãããGoogle Play Storeãããã¦ã³ãã¼ãããã¯ãã¯ãããã¢ããªã«ã¯ã1ã¤ã®ãã¤ããª(ã¾ã㯠apk)ã«ã¹ãã¼ããã©ã³/ã¿ãã¬ããåãã®å®è£ ã¨Android TVåãã®å®è£ ãå«ã¾ãã¦ãã¾ãããã®ãããã¹ãã¼ããã©ã³/ã¿ãã¬ããåãã®ã¯ãã¯ãããã¢ããªã®ãªãªã¼ã¹ãµã¤ã¯ã«ã¨åã卿ã§Android TVåãã®ã¢ããªãæ´æ°ããã¦ãã¾ãã
1ã¤ã®ããã±ã¼ã¸ã«å ¨ã¦ã®ãã©ãããã©ã¼ã ã®å®è£ ãå«ãããã¨ã§ãã©ã®ãã©ãããã©ã¼ã ã«ããã¦ãã¦ã¼ã¶ã¼ã¯ãã ã²ã¨ã¤ã®ã¯ãã¯ãããã¢ããªãæ¢ãã¦ã¤ã³ã¹ãã¼ã«ããã°è¯ããªãã¾ããéçºè å´ã¨ãã¦ããããã±ã¼ã¸ç®¡çãç ©éã«ãªããã«æ¸ãã¨ããå©ç¹ãããã¾ãã䏿¹ã§ãä¾ãã°ã¹ãã¼ããã©ã³/ã¿ãã¬ããåãã®å¯¾å¿ã ã¨æã£ã¦ãããã®ããå ±éãã¦å©ç¨ãã¦ããã©ã¤ãã©ãªã®æ´æ°ãªã©ã«ããTVåãã®æ©è½ãæå³ããå£ããå¯è½æ§ãããã¾ããï¼ããã¯ãã¬ã¼ããªãã«ãªãã¾ããï¼
ã¯ãã¯ãããã§ã¯ããã®ãããªç ´å£ãå«ã¾ããªãããã«ãã¹ãã¼ããã©ã³/ã¿ãã¬ããåæ§ãèªååãããããã¤ãã®ãã¹ãã宿½ãã¦ãã¾ããAndroid TVåãã«é¢ãã¦ã¯ãæ¥é è¡ããªãªã¼ã¹ããã¼ã®ä¸ã§ã¯äººéã®æã«ãã確èªã¯ä¸è¦ã¨ãªã£ã¦ãã¾ãã
ãã®è¨äºã§ã¯ããã®ãããªAndroid TVåãã®ãå°ãããããªä¸çã®ãã¹ãã³ã¼ãã®ã話ããã¾ãã
ã¢ããªã®å¤æ´é »åº¦
Android TVåãã®UI夿´ãå«ãã æ©è½éçºã¯ããã1年以ä¸ã®éãã¹ãã¼ããã©ã³/ã¿ãã¬ããã«æ¯ã¹ã¦ã»ã¨ãã©ããã¾ãããã¾ããã¢ããªã®ç»é¢é·ç§»æ°ãæ©è½ããã¹ãã¼ããã©ã³/ã¿ãã¬ããçã¨æ¯ã¹ãã¨ã¯ããã«å°ãªãã§ãããã®ããããªãªã¼ã¹é »åº¦ã¯ãããªãã«ãããããªãªã¼ã¹æ¯ã®å¤æ´ã¯ãªãç¶æ ãä¿ã£ã¦ãã¾ããã
ä¸å ·åã®çºè¦
ããåå¹´ç¨åº¦ãæ¯ãè¿ãã¨ã2åã»ã©ãã¹ãã¼ããã©ã³/ã¿ãã¬ããå´ã®ä¿®æ£ã«å½±é¿ãããAndroid TVã§ã¯ãã¯ãããã¢ããªãæä½ããæã«ã¯ã©ãã·ã¥ãå¼ãèµ·ããä¸å ·åãæ··å ¥ãã¦ãããã¨ãããã¾ããã1ã¤ã¯ç»åã©ã¤ãã©ãªã«é¢ä¿ãããã®ããã1ã¤ã¯ä¸è¦ãªç»åãªã½ã¼ã¹ãæ¸ããæã®å¯¾å¿æ¼ãã§ãããããã¯ããããããç¨æãã¦ããèªååããããã¹ãã ãã§æ¤åºããã¦ãã¾ãã
社å ã®ã¨ã³ã¸ãã¢ã®å¤ãã¯ãé常ã¯ã¹ãã¼ããã©ã³/ã¿ãã¬ããã使ãéçºãã¦ãã¾ãããå ¨ã¦ã®éçºã«ããã¦ã»ã¨ãã©å½±é¿ã®ãªãAndroid TVã®ç¢ºèªãè¦æ±ãããã¨ã¯å¹ççã§ã¯ããã¾ãããï¼Android TVåãã®å¤ãã®ã³ã¼ãã¯åé¢ããã¦ããããï¼ãã®ããããããããæ³å®ãã¦ããæ¦ç¥ã«æ²¿ã£ã¦ãæå¾ ããã¿ã¤ãã³ã°ã§ã¡ããã¨ä¸å ·åãè¦ã¤ãããã¨ãã§ãã¾ããã
ãªãããã®ãã¹ãã³ã¼ãã®ã¡ã³ããã³ã¹ã³ã¹ããèããæ¹ããããã¨æãã¾ãããAndroid TVåãã®ãã¹ãã·ããªãªã ããå¿ è¦ã«è¿«ããã¦ä¿®æ£ããåæ°ã¯2å¹´éã§1åã§ããä»ã«ã¯Espressoå ¨ä½ã§å ±éãã¦ä½¿ã£ã¦ãã¡ã½ããã®ç½®æãªã©ã§ãã(ä¾ãã°ä»¥ä¸ãè¦ãã¨ãfixã¨ä¿®æ£ãã¦ããã®ã¯1å¹´ç¨åº¦åã®ãã®ã ã)

ãã®ããã«ãã·ã§ã¢ãä½ãã»å¯¾å¿åªå 度ãä½ããã®ã«å¯¾ãã¦ãã¹ãå®è¡ããéãæ¸ããã§ã¯ãªããèªååã«åãã¦ãªã°ã¬ãã·ã§ã³ãã¹ãã¨ãã¦ä¸å ·åããªãªã¼ã¹åã«æ¤åºã§ããå½¢ã«ãã¦ãã¾ããã
èªååããããã¹ãã®ç¨®é¡
ããããã¯ãå°ãå ·ä½ä¾ãæ··ããªããã©ã®ãããªãã¹ãã³ã¼ããæ¸ãã¦ããã®ããè¼ãã¦ããã¾ãã以ä¸ã§ã¯ãã¹ããµã¤ãº ã®åºåãå ã«è¨èã使ã£ã¦ãã¾ããåããã¦è»½ãè£è¶³ãè¶³ãã¾ãããããå°ãåºåãææ¡ãããæ¹ã¯å ã»ã©ã®ãªã³ã¯å ãåç §ãã ããã
Sãµã¤ãº/Mãµã¤ãºã®ãã¹ã
åºãåä½ãã¹ãã¨å¼ã°ãããããªç²åº¦ã®èªåãã¹ãã§ãããããã¯ãã¹ãã¼ããã©ã³/ã¿ãã¬ããå´ã¨å ±éãã¦ä½¿ã£ã¦ãããã®ä»¥å¤ã¯ã»ã¨ãã©æ¸ããã¦ãã¾ãããããã¯ãAndroid TVèªä½ããã°ã¤ã³æ©è½ãæããªããªã©ãæå°éã®æ©è½ã ããæã£ã¦ãããããè¤éãªå é¨ãã¸ãã¯ãæããªããã¥ã¼ã¢ã«ãªã£ã¦ããããã§ãããã®ããããã®ãµã¤ãºã§ã¯ãã¾ãå¤ããã«ãã¼ãããå¾è¿°ããç¯å²ã§å¿ è¦ãªã¶ãã ãã®é åãã«ãã¼ãã¦ãã¾ãã
Lãµã¤ãºã®åä½ã»ã·ããªãªãã¹ã
UIã®åä½ãã¹ãã¨ãã¦ããããã¯ä¸é£ã®çãç»é¢é·ç§»ãã¼ã¹ã®ã·ããªãªããã¨ã«åç»é¢ã®ç¢ºèªãLãµã¤ãºã®ãã¹ãã¨ãã¦å®æ½ãã¦ãã¾ããããã§ã¯Espressoãã¼ã¹ã®ãã¹ãã³ã¼ãã«æ¸ãä¸ãã¦ãã¾ãã
ãã¼ãããã³ã°å®ç¾©
Android TVã§ã¯ãªã¢ã³ã³ã®ä¸ä¸ã»å·¦å³ãªã©ã«å¯¾ãã¦ä»¥ä¸ã®ããã«KeyEventãããå½ã¦ããã¦ãã¾ããããã®ãããAndroid TVã®æèã«ãããç¨èªã®å¯¾å¿ãç¨æããEspressoã®ã·ããªãªãè¨è¿°ããã¨ãã«è¡¨ç¾ãå®éã®TVã®æä½ã«è¿ã¥ãããã«ãã¾ããã
ããã¯ãã·ããªãªã³ã¼ãã®å¯èªæ§ããããããã®ã¡ãã£ã¨ãã工夫ã§ããã
public enum Keys { TV_UP(KeyEvent.KEYCODE_DPAD_UP), TV_LEFT(KeyEvent.KEYCODE_DPAD_LEFT), TV_RIGHT(KeyEvent.KEYCODE_DPAD_RIGHT), TV_DOWN(KeyEvent.KEYCODE_DPAD_DOWN), TV_ENTER(KeyEvent.KEYCODE_DPAD_CENTER), TV_BACK(KeyEvent.KEYCODE_BACK), TV_HOME(KeyEvent.KEYCODE_HOME), DEVICE_BACK(KeyEvent.KEYCODE_BACK); private final int keyCode; Keys(int pKeyCode) { this.keyCode = pKeyCode; } public ViewAction press() { return pressKey(keyCode); } }
ã¾ããAndroid TVã§ã¯ãã®ç¹æ§ä¸ãç¹å®ã®è¦ç´ ã«å¯¾ãã¦ã¹ãã¼ããã©ã³ãªã©ã§ãã ã¿ãã æä½ãããã¾ãããåºæ¬çã«ã¯KeyEventãç¹°ãè¿ãå ¥åãããã¨ã§ã«ã¼ã½ã«ãç§»åãããããæ±ºå®ãããããå¿ è¦ãããã¾ãããã®ãããä¾ãã°ä»¥ä¸ã®ããã«Viewãç¹å®ããããã®ä¸é£ã®æä½ã1ã¤ã®ã¡ã½ããã«ã¾ã¨ãã¦è¨è¿°ãã確èªãããã·ããªãªã«å¯¾ãã¦ãã¤ãºã«ãªããããªè¡¨ç¾ãæ¸ããããããã¾ããã
private ViewInteraction onRelatedRecipeCardOnMainActivity() { return onView(isRoot()) .perform(Keys.TV_DOWN.press()) .perform(Keys.TV_DOWN.press()) .perform(Keys.TV_DOWN.press()) .perform(Keys.TV_DOWN.press()) .perform(Keys.TV_DOWN.press()); }
Eãã¹ãã¨ã¢ããªã®æ´æ°ãã¹ã
ã¢ããªæ´æ°æã«ä½ããã®ãã¤ã°ã¬ã¼ã·ã§ã³ãªã©ã®å¦çãå®è¡ããããããå ´åãããã¼ã«ã«ãã¼ã¿ã®ä¸æ´åãªã©ã«åºãããã¨ã¢ããªãæ´æ°ç´å¾ã«ã¯ã©ãã·ã¥ããããæ¬¡å以éã®èµ·åã«å¤±æãããªã©çºçãããã¨ãããã¾ãã ãã®ãããAndroid TVã«å¯¾ãã¦ãããã§ã«ã¹ãã¼ããã©ã³/ã¿ãã¬ããã«å¯¾ãã¦è¡ãªã£ã¦ããèªååãããUIãã¹ãã®ä¸ãã1ã¤åã®ã¢ããªãã¼ã¸ã§ã³ããã®ã¢ããªæ´æ°ã®ç¢ºèªãèªååããæ¤è¨¼ãããããã«ãã¦ãã¾ããAndroid TVã¯ãããã¯ã¼ã¯ã«æ¥ç¶ããã¦ããã°ã»ã¼å¼·å¶çã«ã¢ããªã®æ´æ°ãå®è¡ããããããã¹ãã¼ããã©ã³/ã¿ãã¬ããã§ã¯éå»7ãã¼ã¸ã§ã³ã«å¯¾ããæ´æ°ç¢ºèªãè¡ã£ã¦ãã䏿¹ã§ã1ã¤åã®å ¬éããã¦ãããã¼ã¸ã§ã³ã®ã¿ã®ç¢ºèªã«ã¨ã©ãã¦ãã¾ãã
ããã§è¡ã£ã¦ãããã¼ã¸ã§ã³ã¢ããã®ç¢ºèªã¯é常ã«ç°¡åã§ã以ä¸ã®ã³ãã³ãã®ããã«1ã¤åã®ãã¼ã¸ã§ã³ããã¼ã«ã«ã«ä¿åãããã¼ã¿ãä¿æããã¾ã¾ãæ°ãããã¼ã¸ã§ã³ã«æ´æ°ããã¨ãããã®ã§ãããã¤ã°ã¬ã¼ã·ã§ã³å¦çãªã©ããã¾ããããªããªã©ããã°ããã®æ´æ°ããå¾ã®ã¢ããªèµ·åã®æã«å¦çããããããªãã¾ãã
# 1ã¤å¤ããã¼ã¸ã§ã³ã®ã¢ããªãã¤ã³ã¹ãã¼ã«ãã $ adb shell install com.example.app $ adb shell am start -n com.example.app/.Main # æ°ããããã¹ããããã¢ããªãã¤ã³ã¹ãã¼ã«ãã $ adb shell install -r com.example.app $ adb shell am start -n com.example.app/.Main
ã¾ã¨ã
å°ãããããªè©±é¡ã¨ãã¦ãAndroid TVã«ãããèªååããããã¹ãç°å¢ãããããã©ã®ç¨åº¦ã®ã¡ã³ããã³ã¹ã³ã¹ãã§è¡ããã¦ããã®ããæ¸ãã¾ããããã®ããã«ã大ããæ©è½è¿½å ã¯ãªããç¶ç¶ãã¦ãªãªã¼ã¹ããå¿ è¦ã®ããæ©è½ã«å¯¾ãã¦ã¯èªååããããã¹ãã¯é常ã«å¹ççã«æ©è½ãã¾ãããããªç¶æ ã«ãªã£ã¦ããã¢ããªã®ä¸ä¾ã§ããã
TVã«é¢ããã¨ã¡ãã£ã¨ãããããã¾è©±
æå¾ã«ãã¡ãã£ã¨ããAndroid TVã«é¢ããç¥è¦ãå
±æãã¦ããã¾ããUI_MODE_TYPE_TELEVISIONã®å¤ã«é¢ãã¦ã§ããUI_MODE_TYPE_TELEVISION ã§Android TVãã©ããå¤å®ããå ´åãå®ã¯Android TV ã§ã¯ãªã 4.x ç³»ã®ã»ãããããããã¯ã¹ç«¯æ«ã¨ããå¼ã£ããããã¨ãããã¾ãããã®ãããUI_MODE_TYPE_TELEVISIONããã¤ãAndroid TVã§ã¯ãªãç°å¢ä¸ã§ãAndroid TVåãã®APIãå¼ãã§ãã¾ã£ãå ´åãã¢ããªãã¯ã©ãã·ã¥ãã¦ãã¾ãã¾ããå½å
ã§ã¯ããã¤ããã®ç¶æ
ã«ãªã端æ«ãåå¨ããããããç§ãã¡ãåç¾ããã¾ã§æ°ã¥ããªãã£ãã®ã§ãããã®ãããªç¶æ
ã«ãªãããã§ãã(ãã ã UI_MODE_TYPE_TELEVISION ã«ããå¤å®ã¯Googleå
¬å¼ã«ãæ¸ããã¦ããæ¹æ³ã§ã¯ããã®ã§ãã)