はじめに
動画系のアプリを作ることになって調べた時のメモです。
概要
今やどの動画/音楽再生系のアプリも常識的に実装されている機能だと思いますが、電車で動画を見ている際にうっかりイヤホンが抜け、大音量で音声が鳴り響くなんて悲劇を避けるために、イヤホンが抜けたタイミングで再生を停止するためにはイヤホンの抜き差しを検知する必要があります。
実装
調べてみたらBroadcastIntentが飛んで来るようなのでそいつを拾って実現します。
BroadcastReceiverを継承したクラスを実装し、onReceive内でIntent.ACTION_HEADSET_PLUG
のstate
から判別していきます。
HeadsetEventReceiver.kt
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.AudioManager
class HeadsetEventReceiver :BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent == null || intent.action != Intent.ACTION_HEADSET_PLUG) {
return
}
val state = intent.getIntExtra("state", AudioManager.SCO_AUDIO_STATE_ERROR)
when(state) {
AudioManager.SCO_AUDIO_STATE_DISCONNECTED -> {
// 切断された時の処理
}
AudioManager.SCO_AUDIO_STATE_CONNECTED -> {
// 接続された時の処理
}
else -> {
// その他の場合の処理
}
}
}
}
EmptyActivityに少しだけ実装を追加し、上記で定義したHeadsetEventReceiverクラスを登録/解除していきます。
今回はMainActivityですが、Serviceでも可でライフサイクルに沿ってregister, unregisterしてやれば良さそうです。
MainActivity.kt
import android.content.Intent
import android.content.IntentFilter
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
private lateinit var receiver: HeadsetEventReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
receiver = HeadsetEventReceiver()
registerReceiver(receiver, IntentFilter(Intent.ACTION_HEADSET_PLUG))
}
override fun onDestroy() {
unregisterReceiver(receiver)
super.onDestroy()
}
}
ここまで完了したらビルドして実行すると、イヤホンの抜き差しのたびHeadsetEventReceiverのonReceiveに切断/接続のstateが送られてきます。
おわりに
思いの外簡単な実装でイヤホンの抜き差しが検知できるようになりました。