最近项目中涉及到物理键以及静音的监听,上来就写了个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;    }    @Override    public 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:                    //normal                    if (silentFlag.equals("1")) {                        mVolumeChangeListener.onVolumeChanged(0);                    }                    IMLog.e("TAG", "铃声");                    break;                case AudioManager.RINGER_MODE_VIBRATE:                    //vibrate                    IMLog.e("TAG", "震动");//                        mVolumeChangeListener.onVolumeChanged(1);                    break;                case AudioManager.RINGER_MODE_SILENT:                    //silent                    IMLog.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);

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

更多相关文章

  1. Android:分析onXXX事件监听器中的两个参数position和id
  2. 史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术
  3. android HOME、back(按钮、事件)截取获得,综合解决方案和分析,包含an
  4. 实现Android的不同精度的定位(基于网络和GPS)
  5. Android(安卓)用户界面---拖放(Drag and Drop)(一)
  6. android安全问题(一) 静音拍照与被拍
  7. Android快速自定义控件+实战演示(三)完整键盘和组合回调!
  8. Android、iOS录音时音量大小计算
  9. Android(安卓)手势操作GestureDetector

随机推荐

  1. Android—— 4.2 Vold挂载管理_NetlinkMa
  2. Android C++层内存泄漏检测
  3. NDK开发笔记——Android使用openssl
  4. Android基础 : Android ContentProvider
  5. android 混淆配置 实例实战项目讲解
  6. 从零开始搞懂Android网络请求——异步加
  7. php做接口+android 请求API接口并展示到L
  8. 用Eclipse开发Android项目
  9. Android dumpsys命令详细使用
  10. android中的显示单位(px,dip/dp,sp)