已弃用的AudioManger.setStreamMute的替代方案?

时间:2015-10-10 18:19:01

标签: android android-6.0-marshmallow android-audiomanager

AudioManger.setStreamMute现已弃用api 23,并且AudioManager.adjustStreamVolume首选AudioManager.ADJUST_MUTE.

我的问题是这种标志只有api 23支持,而我的应用程序是最小api 16.

还有其他方法可以使整个系统静音吗?

如果没有,为什么谷歌会弃用这种方法?

2 个答案:

答案 0 :(得分:22)

我这样做的方法是使用if / else块来使用正确的调用,具体取决于应用当前运行的Android版本。

// Change the stream to your stream of choice. 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
   am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);
} else {
   am.setStreamMute(AudioManager.STREAM_MUSIC, true);
}

答案 1 :(得分:7)

接受的答案在使系统静音时工作正常,但如果您需要恢复状态(例如,当用户暂停/退出您的应用时),请注意adjustStreamVolumesetStreamMute的语义方法不同:

对于setStreamMute,请参阅文档:

  

对给定流的静音请求是   累积:AudioManager可以从中接收几个静音请求   一个或多个客户端和流只有在相同时才会取消静音   收到非静音请求的数量。

adjustStreamVolumeAudioManager.ADJUST_MUTE的情况似乎并非如此。换句话说,如果在使用setStreamMute (stream, true)将其静音之前,流的状态已经静音,则立即setStreamMute (stream, false)将使其处于静音状态,而adjustStreamVolume使用AudioManager.ADJUST_UNMUTE可以取消流的静音。

根据用例,要模拟旧语义,一种方法是在静音之前检查静音状态,如下所示 -

要静音:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!audioManager.isStreamMute(stream)) {
       savedStreamMuted = true;
       audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
    }
} else {
    audioManager.setStreamMute(stream, true);
}

取消静音:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (savedStreamMuted) {
         audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
         savedStreamMuted = false;
    }
} else {
    // Note that this must be the same instance of audioManager that mutes
    // http://stackoverflow.com/questions/7908962/setstreammute-never-unmutes?rq=1
    audioManager.setStreamMute(stream, false);
}

这假设用户不太可能调用另一个应用来静音中间的流,并期望在应用取消静音后流保持静音(无论如何似乎无法检查)。

顺便提一下,isStreamMute方法以前是隐藏的,并且只在API 23中取消隐藏,可以将其用于此目的。