查了很多资料,发现有两种方式可以在app内监听到系统音量变化:
- 一种是通过监听系统的按键事件,重载onKeyUp和onKeyDown来完成,缺点是只能在activity中进行监听,业务在fragment会有点难搞。
- 另外一种就是通过ContentObserver进行监听,我写了一个简单的帮助类,使用的时候只需要换掉listener的类型,在需要音量监听的页面调用register(),生命周期结束时调用unregister()即可。
/**
* 系统音量监听
*
* @property context
* @property listener 自定义listener
*/
class SystemVolumeChangeHelper(val context: Context, val listener: Listener) {
var observer: SettingsContentObserver? = null
var mHandler: Handler? = null
/**
* register
*/
fun register() {
mHandler = Handler()
observer = SettingsContentObserver(mHandler, context, listener)
observer?.let {
context.contentResolver.registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, it)
}
}
/**
* unregister
*/
fun unregister() {
observer?.let {
context.contentResolver.unregisterContentObserver(it)
}
mHandler?.removeCallbacksAndMessages(null)
mHandler = null
}
}
/**
* setting observer
*
* @property handler
* @property context
* @property listener
*/
class SettingsContentObserver(val handler: Handler?, val context: Context, val listener: Listener) : ContentObserver(handler) {
private val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
override fun onChange(selfChange: Boolean) {
listener.onSystemVolumeChange(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
super.onChange(selfChange)
}
}