经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android实现监听音量的变化
来源:jb51  时间:2021/5/10 17:19:10  对本文有异议

本文实例为大家分享了Android实现监听音量变化的具体代码,供大家参考,具体内容如下

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

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

1、监听音量键的变化

方法: 重写 activity onKeyDown函数

  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. switch (keyCode) {
  4. case KeyEvent.KEYCODE_VOLUME_UP:
  5. //音量键up
  6. return false;
  7. case KeyEvent.KEYCODE_VOLUME_DOWN:
  8. //音量键down
  9. return false;
  10. default:
  11. break;
  12. }
  13. return super.onKeyDown(keyCode, event);
  14. }

优点: 快速,方便,简单

缺点: 

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

2、获取音量变化的广播

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

  1. class VolumeChangeHelper(var context: Context){
  2.  
  3. private var mVolumeBroadCastReceiver: VolumeBroadCastReceiver? = null
  4. private var mVolumeChangeListener: VolumeChangeListener? = null
  5.  
  6. companion object{
  7. const val VOLUME_CHANGE_ACTION = "android.media.VOLUME_CHANGED_ACTION"
  8. const val EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE"
  9. }
  10.  
  11. private var audioManager: AudioManager? = context.getSystemService(Context.AUDIO_SERVICE) as? AudioManager
  12.  
  13. fun registerVolumeChangeListener(volumeChangeListener: VolumeChangeListener){
  14. mVolumeChangeListener = volumeChangeListener
  15. mVolumeBroadCastReceiver = VolumeBroadCastReceiver()
  16. val filter = IntentFilter()
  17. filter.addAction(VOLUME_CHANGE_ACTION)
  18. if(mVolumeBroadCastReceiver != null){
  19. //注册这个广播
  20. context.registerReceiver(mVolumeBroadCastReceiver!!, filter)
  21. }
  22. }
  23.  
  24. fun unregisterReceiver(){
  25. if(mVolumeBroadCastReceiver != null){
  26. context.unregisterReceiver(mVolumeBroadCastReceiver!!)
  27. mVolumeBroadCastReceiver = null
  28. }
  29. }
  30.  
  31. interface VolumeChangeListener{
  32. fun onVolumeDownToMin()
  33. fun onVolumeUp()
  34. }
  35. //定义一个想监听音量变化的广播接受者
  36. inner class VolumeBroadCastReceiver : BroadcastReceiver(){
  37. override fun onReceive(context: Context?, intent: Intent?) {
  38. if(intent?.action == VOLUME_CHANGE_ACTION && intent?.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1) == AudioManager.STREAM_MUSIC){
  39. val currentVolume = audioManager?.getStreamVolume(AudioManager.STREAM_MUSIC) ?: -1
  40. if(currentVolume > 0){
  41. mVolumeChangeListener?.onVolumeUp()
  42. } else if( currentVolume == 0){
  43. mVolumeChangeListener?.onVolumeDownToMin()
  44. }
  45. }
  46. }
  47.  
  48. }
  49. }

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号