接受的答案在使系统静音时效果很好,但是如果您需要恢复状态(例如当用户暂停/退出您的应用程序时),请注意 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 中未隐藏,因此可以将其用于此目的。