ã¯ããã«
ãã®èšäºã§ã¯ãNexus PlayerãFire TVãªã©ã®Android OS(ãŸãã¯Fire OS)ãæèŒããAndroid TV察å¿ç«¯æ«äœ¿çšæã«ããããTV端æ«ã®é»æºON/OFFãå ¥ååæ¿ãæ€ç¥ããæ¹æ³ã玹ä»ããŸãã
çšèªå®çŸ©
䌌ããããªçšèªãå€ãåºãŠããã®ã§ããããããããããæ¬èšäºã§ã¯ä»¥äžã®ããã«å®çŸ©ããŠäœ¿çšãããŠããã ããŸãðââïž
çšèª | æŠèŠ |
---|---|
å€éšç«¯æ« | Nexus Player/Fire TVãªã©ã®ä»å±ã®HDMIããã¬ã端æ«ã«æ¥ç¶ããç«¯æ« |
å èµç«¯æ« | BRAVIAãªã©ã®Android OSãå èµãããã¬ãç«¯æ« |
TVç«¯æ« | Android OSã®å èµæç¡ã«é¢ãããªãå šãŠã®ãã¬ã端æ«ããã£ã¹ãã¬ã€ç«¯æ« |
ãªãŒãã£ãªç«¯æ« | å€ä»ãã¹ããŒã«ãŒãªã©ã®ä»å±ã®HDMIããã¬ã端æ«ã«æ¥ç¶ããç«¯æ« |
ã¢ã㪠| éçºå¯Ÿè±¡ã®Android TVã¢ããªã±ãŒã·ã§ã³ |
èæ¯
Nexus PlayerãFire TVãªã©ã䜿ã£ãŠãTV端æ«ã§æ åã³ã³ãã³ãã楜ããã§ããæ¹ãå€ããšæããŸãã
ã¿ãªããããããã®ç«¯æ«ã£ãŠã©ããã£ãŠäœ¿ã£ãŠãŸããïŒ
èŠçµãã£ãããTV端æ«ã®ãªã¢ã³ã³ãœã¡ãŒã£ãŠãã£ãŠãŸãããïŒ
ãããªãã§ãïŒå®ã¯ãTV端æ«ã®é»æºãæ¶ããã ãã§ã¯å€éšç«¯æ«ã®é»æºãäŸçµŠãããŠããéããå€éšç«¯æ«ã¯èµ·åãã£ã±ãªããªãã§ããïŒðš
ããããããå®éã«ãŠãŒã¶ããã€ã¢ããªã®äœ¿çšãããããã£ãŠããã®ãåãããªãã§ããã...
ãšããããšã§ãäœãããæ¹æ³ã¯ãªãããªãŒãšèª¿ã¹ãçµæã玹ä»ããŸãðââïž
å®ã¯ãAmazonã®Developerãµã€ãã«Fire TVäžã®HDMIã€ãã³ãã®åŠçãšããé
ç®ã§ã説æããããŠããŸãã
ãããããã®ããã¥ã¡ã³ãã ãã ãšåãããªãæ§ã
ãªãŠãŒã¹ã±ãŒã¹ãããã®ã§ãä»åã¯ãã®æ€èšŒçµæã«ã€ããŠããŸãšããŠãããŸãã
䜿çšããAPIã«ã€ããŠ
BroadcastReceiver
ã䜿çšããŠãååŸã§ããã€ãã³ãã®äžã€ã« ACTION_HDMI_AUDIO_PLUG
ãšãããã®ãååšããŸãã
ãã®ã€ãã³ã㯠AudioManager
ã¯ã©ã¹ã«å®çŸ©ãããŠãããæ åãé³å£°ãåºåããHDMIã®æ¥ç¶ç¶æ
ãéç¥ããã€ãã³ãã§ãã
ããã§ãåºåã匷調ããŠããèš³ã¯ãæ¬èšäºãèªã¿é²ããŠãããšç解ã§ãããšæããŸãã
ãã® ACTION_HDMI_AUDIO_PLUG
ãšããã€ãã³ãã¯ãç©ççã«HDMIã³ãŒããæ¥ç¶/åæããå Žåã ãã§ãªããTV端æ«ã®é»æºãON/OFFã«ããå Žåãªã©ã«ãéç¥ãããŸãã
ãããå©çšããŠãTV端æ«ã®é»æºON/OFFãå
¥ååæ¿ãæ€ç¥ããŸãã
åºåHDMIã®æ¥ç¶/åæç¶æ ã«ã€ããŠ
ACTION_HDMI_AUDIO_PLUG
ãå©çšããŠãåºåHDMIã®æ¥ç¶ç¶æ
å€åãéç¥ããããšã¯åãã£ããšæããŸãã
ã§ã¯ãåºåHDMIã®æ¥ç¶ç¶æ
å€åãèµ·ãã£ãæã®ç¶æ
ãååŸããæ¹æ³ã説æããŸãã
AudioManager
ã¯ã©ã¹ã®äžã«ã¯ EXTRA_AUDIO_PLUG_STATE
ãšãããã®ãååšããŸããACTION_HDMI_AUDIO_PLUG
ã€ãã³ããé£ãã§ããæã«ããã® EXTRA_AUDIO_PLUG_STATE
ã®å€ã Intent
ããååŸããããšãã§ããŸãã
EXTRA_AUDIO_PLUG_STATE
ã®å€ã¯ãåºåHDMIæ¥ç¶æã« 1
ãšãªããåºåHDMIåææã« 0
ãšãªããŸãã
ã€ãŸããTV端æ«ã®é»æºãONã«ãªã£ãæ
ãå
¥ååæ¿ã«ãã£ãŠãå¥ã®å
¥åããã¢ããªãèµ·åããŠããå
¥åã«åãæ¿ããããæ
ã«ã¯ 1
ã«ãªããŸãã
éã«ãTV端æ«ã®é»æºãOFFã«ãªã£ãæ
ãå
¥ååæ¿ã«ãã£ãŠãã¢ããªãèµ·åããŠããå
¥åããå¥ã®å
¥åã«åãæ¿ããããæ
ã«ã¯ 0
ã«ãªããŸãã
å®è£
説æã¯ãã®ãããã«ããŠãå®è£ ãèŠãŠãããŸãããïŒ
https://github.com/ronnnnn/HDMIPlugStateSample
ãã¡ãã«ãµã³ãã«ã¢ããªãäœæããã®ã§ããã²åèã«ããŠãã ããð
BroadcastReceiver
ã«ã€ããŠ
ACTION_HDMI_AUDIO_PLUG
ã€ãã³ããåŠçããã«ã¯ãBroadcastReceiver
ãç¶æ¿ããã¯ã©ã¹ãäœæããŸãã
ãããŠãBroadcastReceiver#onReceiver
ãOverrideããŠããã®äžã«ã€ãã³ããåãåã£ãæã«ããããããšãå®è£
ããŠãããŸãã
ãã®èŸºã¯åºæ¬ç㪠BroadcastReceiver
ã«ãã Intent
ã¢ã¯ã·ã§ã³ã®ãã³ããªã³ã°æ¹æ³ãšåãã§ããðââïž
class HDMIPlugStateBroadcastReceiver : BroadcastReceiver() {
companion object {
private const val PLUGGED_IN: Int = 1
private const val UNPLUGGED: Int = 0
}
override fun onReceive(context: Context?, intent: Intent?) {
// ãã㧠ACTION_HDMI_AUDIO_PLUG ã€ãã³ããåŠçãã
intent ?: return
if (intent.action == AudioManager.ACTION_HDMI_AUDIO_PLUG) {
val plugState = intent.getIntExtra(AudioManager.EXTRA_AUDIO_PLUG_STATE, -1) // ããã€ãçŸåšã®æ¥ç¶ç¶æ
val address = intent.getStringExtra("address")
val state = intent.getIntExtra("state", -1)
val portName = intent.getStringExtra("portName")
when (plugState) {
UNPLUGGED -> {
Timber.d(StringBuilder(" \n")
.append("--------------- HDMI is unplugged ---------------\n")
.append("address is ${address}\n")
.append("state is ${state}\n")
.append("port name is ${portName}\n")
.append("---------------------------------------------------")
.toString()
)
}
PLUGGED_IN -> {
Timber.d(StringBuilder(" \n")
.append("--------------- HDMI is plugged in ---------------\n")
.append("address is ${address}\n")
.append("state is ${state}\n")
.append("port name is ${portName}\n")
.append("---------------------------------------------------")
.toString()
)
}
else -> Timber.e("invalid ACTION_HDMI_AUDIO_PLUG value")
}
}
}
}
ããã§æ³šç®ãããã®ãã Intent
ãçµç±ããŠååŸã§ããå€ã«ã€ããŠã§ãã
EXTRA_AUDIO_PLUG_STATE
ã®å€ãååŸã§ããã®ã¯å
ã§èª¬æããŸãããããã®ã€ãã³ãã® Intent
ã«ã¯ããã以å€ã«ãã"address"
ã"state"
ã"portName"
ãšããkeyã®å€ãä»éããŠããããã§ãã
ç§ã®ç°å¢ã§ã¯ "state"
ã®å€ã¯ EXTRA_AUDIO_PLUG_STATE
ã®å€ãšåãã§ã"state"
ã"portName"
ã®å€ã¯ç©ºã§ãããããã¥ã¡ã³ãã«ããããã®keyã«ã€ããŠã®èª¬æãèŠã€ããããªãã£ãã®ã§ãäœããããæ¹ãããŸãããæããŠãã ããðââïž
BroadcastReceiver
ã®ç»é²ã«ã€ããŠ
ããã¥ã¡ã³ãã«ãèšèŒãããŠããŸãããä»å説æããŠãã ACTION_HDMI_AUDIO_PLUG
ã®ã€ãã³ãã¯ãContext#registerReceiver
ã䜿çšã㊠BroadcastReceiver
ãç¶æ¿ããã¯ã©ã¹ãç»é²ããå¿
èŠããããŸãã
AndroidManifest.xml
ã«ãã®ã¯ã©ã¹ãç»é²ããŠãã€ãã³ããåãåãããšãã§ããŸããã®ã§ã泚æããŠãã ããã
ä»åã¯ãApplication
ã¯ã©ã¹ãç¶æ¿ããã¯ã©ã¹ã§ç»é²ã解é€ãè¡ã£ãŠããŸãã
class App : Application() {
private val hdmiPlugStateBroadcastReceiver: HDMIPlugStateBroadcastReceiver =
HDMIPlugStateBroadcastReceiver()
override fun onCreate() {
super.onCreate()
initializeReceiver()
}
override fun onTerminate() {
terminateReceiver()
super.onTerminate()
}
private fun initializeReceiver() {
registerReceiver(
hdmiPlugStateBroadcastReceiver,
IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG)
)
}
private fun terminateReceiver() {
unregisterReceiver(hdmiPlugStateBroadcastReceiver)
}
}
Context#registerReceiver
ã®ç¬¬äºåŒæ°ã« ACTION_HDMI_AUDIO_PLUG
ã® IntentFilter
ãæž¡ãããšããå¿ããªãïŒ
EXTRA_AUDIO_PLUG_STATE
ã®å€ã«ã€ããŠ
ãããŸã§èª¬æããŠãããEXTRA_AUDIO_PLUG_STATE
ã®å€ããã©ããã£ãå Žåã«å€åããããæ€èšŒããã®ã§ãäžã«ãŸãšããŠãããŸãã
ä»ã«ããã®ãã¿ãŒã³ã®æã¯ã©ããªãã ð€ãªã©ãããŸããããæããŠãã ããïŒ
âã®å€ãååŸã§ããã®ã¯åºæ¬çã«ãå€éšç«¯æ«ã®é»æºãå ¥ã£ãŠãã(ã³ã³ã»ã³ãé»æºäŸçµŠ)ãã¢ããªãèµ·åããŠããããšãåæã§ãã
ãã¿ãŒã³ |
EXTRA_AUDIO_PLUG_STATE ã®å€ |
åè |
---|---|---|
å€éšç«¯æ«ä»å±ã®HDMIãTV端æ«ããåæ | 0 |
ãã¬ã端æ«ã§ãªããã£ã¹ãã¬ã€ç«¯æ«ã§ã®æ€èšŒã§ã¯ 0 ã®ã¿ãåããããBRAVIAã§ã®æ€èšŒã§ã¯ 0 -> 1 -> 0 ãç¢ºèª |
å€éšç«¯æ«ä»å±ã®HDMIãTV端æ«ã«æ¥ç¶ | 1 |
|
TV端æ«ã®å ¥ååæ¿ã§å¥ã®å ¥åãžé·ç§» | 0 |
|
TV端æ«ã®å ¥ååæ¿ã§å¥ã®å ¥åãã移å | 1 |
|
TV端æ«ã®é»æºoff (TV端æ«ã®äž»é»æºon) | 0 |
|
TV端æ«ã®é»æºoff (TV端æ«ã®äž»é»æºãåæã«off) | - | ã¢ããªã匷å¶çµäºãããããäœãåããªã |
TV端æ«ã®é»æºoff (å€éšç«¯æ«ã®é»æºãåæã«off) | - | TV端æ«ã®USBããŒããé»æºäŸçµŠæºãšããŠããå Žåã«ã¯ãTV端æ«ã®é»æºoffãšåæã«ã¢ããªã匷å¶çµäºãããããäœãåããªã |
TV端æ«ã®é»æºon | 1 |
|
ã¢ããªèµ·åäžã«å€éšç«¯æ«ã®é»æºoff->é»æºon | 1 |
å€éšç«¯æ«ã®åèµ·åæã«ã¢ããªãè£ã§èµ·åããã 1 ã®ã€ãã³ããçºç«ãã (FireTVã®ã¿ã§ããæ€èšŒããŠãªã) |
ã¿ãŒã²ãããšããå€éšç«¯æ«ãåºãã£ãŠããHDMIããŒã以å€ã®HDMIããŒããžã®HDMIæ¥ç¶/åæ | - | å¥ã®å€éšç«¯æ«ãã¢ããªãææããèµ·åããŠããŠãã€ãã³ãã¯çºç«ãããªã |
å€éšç«¯æ«ã§ã¢ããªã®èµ·å | 1 |
ãã ããã¢ããªãèµ·åäžã®å Žåã¯ã€ãã³ãã¯çºç«ãããªã |
ãªãŒãã£ãªç«¯æ«ã®æ¥ç¶ã»åæ | - |
ããŸã
ä»åã¯Nexus PlayerãFire TVãªã©ã®TV端æ«ã«æ¥ç¶ããŠäœ¿çšããAndroid TV端æ«ã®å Žåã説æããŠããŸããã
ã§ãããBRAVIAãªã©ã®Android OSå
èµç«¯æ«ã¯ã©ããªãã ð€ãšæã£ãæ¹ãããããšæããŸãã
ç§ãè¡ã£ãæ€èšŒã®éãã ãšãå
èµç«¯æ«ã®å Žåã¯ãåºæ¬çã«å€éšç«¯æ«ã®ããã«åºåHDMIãæããªããããTV端æ«ã®HDMIããŒãã«HDMIãæ¥ç¶/åæãããŠã ACTION_HDMI_AUDIO_PLUG
ã€ãã³ãã¯çºç«ãããŸããã
ãã ãããªãŒãã£ãªç«¯æ«ã䜿çšããŠãå
èµç«¯æ«ã®é³å£°ãHDMIçµç±ã§åºåããŠããå Žåã«ã¯ããªãŒãã£ãªç«¯æ«ã®HDMIæ¥ç¶/åæã«ãã ACTION_HDMI_AUDIO_PLUG
ã€ãã³ããçºç«ãããŠããŸããŸãð
ãã®ãããå
èµç«¯æ«ã«ãããŠãTV端æ«ã®é»æºON/OFFãå
¥ååæ¿ãæ€ç¥ããã«ã¯ãApplication
ã Activity
ãªã©ã®ã©ã€ããµã€ã¯ã«ãå©çšããã®ãããããšèããŠããŸãã
ã¡ãã£ãšããããªå
容ã ã£ããããããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸãïŒ
äœããããŸãããããã²ã³ã¡ã³ããã ããð