音量の変更を検知する

Android アプリ内で音量の変更を検知したいときって、なぜか音量ボタンのイベントフックしろみたいなページがやたら見付かるんだけど、それはダメで、なぜなら音量ボタン以外の方法によって音量を変えられることがあるからである。

具体的には音量ボタン押すと画面に音量調節スライダーみたいなの出てきて、これ弄った時には音量ボタンの押下イベントなんて発生しない。

で、どうやって変更を検知するかというと BroadcastReceiver で android.media.VOLUME_CHANGED_ACTION を見張っておけばよい。音量が変更されるとこのブロードキャストが飛んでくるので、飛んできたら都度 VolumeManager で getStreamVolume などして現在の音量を取るとよい。