实现监听音量的变化

最近项目中涉及到了音量监听然后作出改变的需求,特此mark一下

想监听音量的变化通用的就两种方法:

1、监听音量键的变化

方法: 重写 activity onKeyDown函数


@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                //音量键up
                return false;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                //音量键down
                return false;
            default:
                break;
        }
        return super.onKeyDown(keyCode, event);
}

复制代码

优点: 快速,方便,简单

缺点: 

1. 容易消耗音量键改变事件(返回false有时也没用),实测
2. 该监听针对当前Activity,不同的Ac要重新重写onKeyDown函数
3. 由第二点可知,无法做到整个应用范围监听

2、获取音量变化的广播

系统音量变化的时候会发送广播,监听这个就行,音量变化的action是
android.media.VOLUME_CHANGED_ACTION
具体的见代码:(kotlin版本)


class VolumeChangeHelper(var context: Context){

    private var mVolumeBroadCastReceiver: VolumeBroadCastReceiver? = null
    private var mVolumeChangeListener: VolumeChangeListener? = null

    companion object{
        const val  VOLUME_CHANGE_ACTION = "android.media.VOLUME_CHANGED_ACTION"
        const val EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE"
    }

    private var audioManager: AudioManager? =  context.getSystemService(Context.AUDIO_SERVICE) as? AudioManager

    fun registerVolumeChangeListener(volumeChangeListener: VolumeChangeListener){
        mVolumeChangeListener = volumeChangeListener
        mVolumeBroadCastReceiver = VolumeBroadCastReceiver()
        val filter = IntentFilter()
        filter.addAction(VOLUME_CHANGE_ACTION)
        if(mVolumeBroadCastReceiver != null){
            //注册这个广播
            context.registerReceiver(mVolumeBroadCastReceiver!!, filter)
        }
    }

    fun unregisterReceiver(){
        if(mVolumeBroadCastReceiver != null){
            context.unregisterReceiver(mVolumeBroadCastReceiver!!)
            mVolumeBroadCastReceiver = null
        }
    }

    interface VolumeChangeListener{
        fun onVolumeDownToMin()
        fun onVolumeUp()
    }
    
    //定义一个想监听音量变化的广播接受者
    inner class VolumeBroadCastReceiver : BroadcastReceiver(){
        override fun onReceive(context: Context?, intent: Intent?) {
            if(intent?.action == VOLUME_CHANGE_ACTION && intent?.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1) == AudioManager.STREAM_MUSIC){
                val currentVolume = audioManager?.getStreamVolume(AudioManager.STREAM_MUSIC) ?: -1
                if(currentVolume > 0){
                    mVolumeChangeListener?.onVolumeUp()
                } else  if( currentVolume == 0){
                    mVolumeChangeListener?.onVolumeDownToMin()
                }
            }
        }

    }
}

复制代码

想实现全局监听的话,可以在在一个app生命周期内都存在的Context里去监听,比如MainActivity

转自:Android实现监听音量的变化_移动开发-学习编程-模板哥

Android 中,你可以通过创建一个 `BroadcastReceiver` 广播接收器来监听音量变化。下面是一个示例代码: 首先,在你的 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> ``` 然后,创建一个新的 Java 类来实现广播接收器: ```java public class VolumeButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action != null && action.equals("android.media.VOLUME_CHANGED_ACTION")) { // 处理音量改变的逻辑 int currentVolume = intent.getIntExtra("android.media.EXTRA_VOLUME_STREAM_VALUE", -1); int previousVolume = intent.getIntExtra("android.media.EXTRA_PREV_VOLUME_STREAM_VALUE", -1); // 在这里执行你的操作,比如发送广播或者调用相应的方法 // ... } } } ``` 接下来,在你的 Activity 或者 Service 中注册广播接收器: ```java public class MainActivity extends AppCompatActivity { private VolumeButtonReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建广播接收器实例 receiver = new VolumeButtonReceiver(); // 创建 IntentFilter 并添加音量改变的 action IntentFilter filter = new IntentFilter(); filter.addAction("android.media.VOLUME_CHANGED_ACTION"); // 注册广播接收器 registerReceiver(receiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 在 Activity 销毁时注销广播接收器 unregisterReceiver(receiver); } } ``` 这样,当用户按下音量时,`VolumeButtonReceiver` 类中的 `onReceive()` 方法将会被调用,你可以在这个方法中执行你想要的操作。注意,在 Android 8.0(API 级别 26)及以上版本中,需要在运行时请求 `MODIFY_AUDIO_SETTINGS` 权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值