平时将android系统的system volume调为0时,常常会发现其他几个种类的也会跟着mute,不能说是将其他的streamtype也调为0,因为当system volume大于0时,其他几个相关的volume value又恢复了,说明其他几个Stream只是被Mute住了,所以要增加或者取消这种Mute相关性,比如,现在StreamType=STREAM_SYSTEM,对应volume调为0时,这是会发现ring/notification的都Mute了,这是如果让他们不要Mute,或者Music在SYSTEM为0时,他不是Mute住的,要将其Mute的,如何操作了,可以参考下面的:

参考一:


STREAM_SYSTEM_ENFORCED在4.0中也有定义,但是4.0和2.3架构不太一样,修改也不一样。 目前我们下面的note告诉您在android2.3上面完整的修改方法: 第一步: 改mediatek/config/{project}/system.prop, 其中 ro.camera.sound.forced=0 如果 原本没有定义就不用改了  第二步所需要的修改如下: 1.修改DatabaseHelper.java的loadVolumeLevels方法,将 loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED, (1 << AudioManager.STREAM_RING) | (1 << AudioManager.STREAM_NOTIFICATION) | (1 << AudioManager.STREAM_SYSTEM) | (1 << AudioManager.STREAM_SYSTEM_ENFORCED)); 替换为: loadSetting(stmt, Settings.System.MODE_RINGER_STREAMS_AFFECTED, (1 << AudioManager.STREAM_RING) | (1 << AudioManager.STREAM_NOTIFICATION) | (1 << AudioManager.STREAM_SYSTEM)); 2.修改AudioService.java的setStreamMute方法,在 if (isStreamAffectedByMute(streamType)) { mStreamStates[streamType].mute(cb, state); } 之前添加: if(streamType == AudioSystem.STREAM_SYSTEM_ENFORCED){ mStreamStates[streamType].mute(cb, state); } 3.修改AudioService.java的STREAM_VOLUME_ALIAS数组,将第8个值 AudioSystem.STREAM_SYSTEM, // STREAM_SYSTEM_ENFORCED 改为: AudioSystem.STREAM_SYSTEM_ENFORCED, // STREAM_SYSTEM_ENFORCED 4.请使用如下语句来打开或者关闭拍照音: 1)获取AudioManager AudioManager mAM; mAM = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 2)打开拍照音: mAM.setStreamMute(AudioManager.STREAM_SYSTEM_ENFORCED, false); 3)关闭拍照音: mAM.setStreamMute(AudioManager.STREAM_SYSTEM_ENFORCED, true);  关于上层菜单的实现,按照自己的需求设计,调用上面提供的接口即可。


参考二:


最近在写Android的Audio代码时发现,setStreamMute对一些stream type没有效果。例如alarm stream。   后调查发现,在set stream mute的时候会调用函数isStreamAffectedByMute来判断指定的stream是否可以mute。   函数isStreamAffectedByMute中使用mMuteAffectedStreams进行判断。      return (mMuteAffectedStreams & (1 << streamType)) != 0;   mMuteAffectedStreams在函数readPersistedSettings中被赋值:         mMuteAffectedStreams = System.getInt(cr,                 System.MUTE_STREAMS_AFFECTED,                 ((1 << AudioSystem.STREAM_MUSIC)|(1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_SYSTEM)));  函数loadVolumeLevels中对此进行了设定:             loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,                     ((1 << AudioManager.STREAM_MUSIC) |                      (1 << AudioManager.STREAM_RING) |                      (1 << AudioManager.STREAM_NOTIFICATION) |                      (1 << AudioManager.STREAM_SYSTEM)));   如果要使某种stream可被mute,在此处添加该stream即可。