AudioManger.setStreamMute现已弃用api 23,并且AudioManager.adjustStreamVolume
首选AudioManager.ADJUST_MUTE.
我的问题是这种标志只有api 23支持,而我的应用程序是最小api 16.
还有其他方法可以使整个系统静音吗?
如果没有,为什么谷歌会弃用这种方法?
答案 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)
接受的答案在使系统静音时工作正常,但如果您需要恢复状态(例如,当用户暂停/退出您的应用时),请注意adjustStreamVolume
和setStreamMute
的语义方法不同:
对于setStreamMute
,请参阅文档:
对给定流的静音请求是 累积:AudioManager可以从中接收几个静音请求 一个或多个客户端和流只有在相同时才会取消静音 收到非静音请求的数量。
adjustStreamVolume
与AudioManager.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中取消隐藏,可以将其用于此目的。