最近项目中涉及到物理键以及静音的监听,上来就写了个BrocastReceiver,然后注册,处理。但是在测的时候发现,在不同的手机上的这块的onReceive()回调是有不一样的,以下为总结:

1.类型一:有背景音乐播放的时候 音量上下键调节的是媒体音量,否则调节的是系统音量

2.类型二:除了通过上下键调节,还需要对静音键进行监听

3.还有一个影响因素  就是多进程:会导致多次调用,这时候需要过滤进程

/*** 监听系统音量** @author by */
public class VolumeReceiver extends BroadcastReceiver {public static final String ACTION_VOLUME_CHANGED = "android.media.VOLUME_CHANGED_ACTION";public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE";public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";private VolumeChangeListener mVolumeChangeListener;public void setVolumeChangeListener(VolumeChangeListener volumeChangeListener) {this.mVolumeChangeListener = volumeChangeListener;}@Overridepublic void onReceive(Context context, Intent intent) {synchronized (this) {if (!getProcessName(context).equals("com.test.cn")) {return;}if (ACTION_VOLUME_CHANGED.equals(intent.getAction())&& (intent.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1) == AudioManager.STREAM_MUSIC)) {handleChangeListener(context, AudioManager.STREAM_MUSIC);} else if (ACTION_VOLUME_CHANGED.equals(intent.getAction())) {handleChangeListener(context, AudioManager.STREAM_SYSTEM);} else if (RINGER_MODE_CHANGED_ACTION.equals(intent.getAction())) {AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);final int ringerMode = audioManager.getRingerMode();String silentFlag = VoiceMediaManager.getInstance(context).getSilent() ? "1" : "0";switch (ringerMode) {case AudioManager.RINGER_MODE_NORMAL://normalif (silentFlag.equals("1")) {mVolumeChangeListener.onVolumeChanged(0);}IMLog.e("TAG", "铃声");break;case AudioManager.RINGER_MODE_VIBRATE://vibrateIMLog.e("TAG", "震动");
//                        mVolumeChangeListener.onVolumeChanged(1);break;case AudioManager.RINGER_MODE_SILENT://silentIMLog.e("TAG", "静音");if (silentFlag.equals("0")) {mVolumeChangeListener.onVolumeChanged(1);}break;}}}}public interface VolumeChangeListener {/*** 系统媒体音量变化** @param volume 音量大小*/void onVolumeChanged(int volume);}int musicVoice=0;int systenVoice=0;public void handleChangeListener(Context context, int type) {AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);int streamVolume = 0;if (mAudioManager != null) {streamVolume = mAudioManager.getStreamVolume(type);if (type == AudioManager.STREAM_SYSTEM) {if (systenVoice==streamVolume){return;}systenVoice=streamVolume;IMLog.e("TAG",   "系统音量" + streamVolume);} else if (type == AudioManager.STREAM_MUSIC) {if (musicVoice==streamVolume){return;}musicVoice=streamVolume;IMLog.e("TAG",   "媒体音量" + streamVolume);}if (mVolumeChangeListener != null) {mVolumeChangeListener.onVolumeChanged(streamVolume);}}}/***获取当前进程名称*/private String getProcessName(Context context) {int pid = android.os.Process.myPid();ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);if (mActivityManager != null) {for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses()) {if (appProcess.pid == pid) {return appProcess.processName;}}}return null;}}

注册:

VolumeReceiver receiver = new VolumeReceiver();
volumeBroadcastReceiver.setVolumeChangeListener(this);
IntentFilter filter = new IntentFilter();
filter.addAction(VolumeReceiver.ACTION_VOLUME_CHANGED);
filter.addAction(VolumeReceiver.RINGER_MODE_CHANGED_ACTION);
mContext.registerReceiver(receiver, filter);

//在不同手机适配的时候 ,最好打印手机的音量变化 以及静音模式日志 可以分析不同系统的走向进而进行适配。

关于监听Android的静音键以及音量按键相关推荐

  1. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  2. android 回退函数,详解React Native监听Android回退按键与程序化退出应用

    详解React Native监听Android回退按键与程序化退出应用 发布时间:2020-09-29 09:25:52 来源:脚本之家 阅读:137 作者:lqh 详解React Native监听A ...

  3. android 屏幕方向监听,Android如何监听屏幕旋转

    背景 关于个人,前段时间由于业务太忙,所以一直没有来得及思考并且沉淀点东西:同时组内一个个都在业务上能有自己的思考和总结,在这样的氛围下,不由自主的驱使周末开始写点东西,希望自己除了日常忙于业务,可以 ...

  4. 监听android.intent.action.PHONE_STATE状态重复执行问题

    /*** 监听android.intent.action.PHONE_STATE广播时,API21以上会收到两次回调,这两次的state(idle.ringing.offhook)是一样的,使用lab ...

  5. ionic监听android息屏和后台运行的生命周期

    Hi,宝宝们,我又来了,我最近遇到一个问题,就是在ionic中监听android的息屏.应用退出在后台运行,之后重新进入应用的事件,这个写过原生的都知道,android会在不用的时间,运行不同的生命周 ...

  6. 回退监听android,详解React Native监听Android回退按键与程序化退出应用

    详解React Native监听Android回退按键与程序化退出应用 前言 我们知道Android回退按键,会控制页面返回, 并且退出应用并非真正意义退出,仍在后台运行,所以在某些场景下需要监控an ...

  7. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  8. android edittext 光标监听,Android EditText监听器,用于光标位置更改

    我有一个EditText对话框. EditText在创建时已经填充.当用户将光标放置在文本的特定部分或其附近时,Toast将弹出. 我的问题是监听光标位置的变化.另一个post提出同样的问题,并且接受 ...

  9. android底层按键监听,Android应用中Back键的监听及处理实例

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

最新文章

  1. java反射po转vo_三步走使用Dozer (Do,Po,Vo转换工具)
  2. 魔改CNN揭秘宇宙大爆炸:物理学的核心是对称性
  3. python 散点图_Python绘制散点图
  4. 地砖中间高四边低_地砖上墙到底好不好?幸好我家没这么做否则全毁了!
  5. 代码覆盖率测试工具:gcov和lcov的使用
  6. 前端学习(2368):编程式导航
  7. NSRunloop小总结
  8. 【分享-快速仿站】无敌超强仿站小工具一键下载
  9. spring cloud config的bootstrap.yml与application.proterties的区别
  10. 95-855-040-源码-调度-Flink Schedule Mode 调度模式
  11. tomcat基础应用详解
  12. Design Patterns(二十四):Visite Pattern--VB代码
  13. 杰控连接mysql_杰控FameView在数据库连接和查询方面的应用
  14. 备考OCJP认证知识点总结(五)
  15. Tomcat CVE-2020-1938(CNVD-2020-10487) 漏洞复现
  16. java+sql宿舍管理系统
  17. 为intent添加FLAG_EXCLUDE_STOPPED_PACKAGES标记
  18. 用科傻软件,求平面网和高程网的平差
  19. 【行业案例分享】平安云加速银行数字化转型!
  20. 下载的软件包保存在缓存中,直到下次成功执行事务。 您可以通过执行 'dnf clean packages' 删除软件包缓存。 错误:事务检查错误

热门文章

  1. 苹果认怂了!iPhone 将改用 USB-C 接口
  2. 教授专栏13 | 陈雷:数据科学助力AI落地
  3. eclipse报错 错误: 找不到或无法加载主类
  4. 图书云小程序体验版1.0.1发布
  5. 【机器学习】常见问题
  6. 你中了微软的圈套么?
  7. ubuntu中自带的ufw防火墙
  8. android 包命名不管你怎么命,千万不要用下面几个
  9. 【数据结构】单链表的实现
  10. 中信银行总行信息科技岗2019年校园招聘