已弃用 AudioManger.setStreamMute 的替代方案?
Alternative for deprecated AudioManger.setStreamMute?
AudioManger.setStreamMute 现在已弃用 api 23,最好将 AudioManager.adjustStreamVolume
与 AudioManager.ADJUST_MUTE.
一起使用
我的问题是只有 api 23 支持这种标志,而我的应用程序最小 api 16。
是否有其他方法可以使整个系统静音?
如果不是,为什么 google 弃用此方法?
我的做法是使用 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);
}
接受的答案可以很好地使系统静音,但如果您需要恢复状态(例如,当用户暂停/退出您的应用程序时),请注意 adjustStreamVolume
和 [=13 的语义=] 方法不同:
对于 setStreamMute
,来自文档:
The mute requests for a given stream are
cumulative: the AudioManager can receive several mute requests from
one or more clients and the stream will be unmuted only when the same
number of unmute requests are received.
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
//
audioManager.setStreamMute(stream, false);
}
这假设用户不太可能调用另一个应用来静音中间的流,并期望在您的应用取消静音后流保持静音(无论如何似乎没有办法检查这一点)。
顺便说一句,isStreamMute
方法以前是隐藏的,只是在 API 23 中才取消隐藏,因此可以用于此目的。
AudioManger.setStreamMute 现在已弃用 api 23,最好将 AudioManager.adjustStreamVolume
与 AudioManager.ADJUST_MUTE.
我的问题是只有 api 23 支持这种标志,而我的应用程序最小 api 16。
是否有其他方法可以使整个系统静音?
如果不是,为什么 google 弃用此方法?
我的做法是使用 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);
}
接受的答案可以很好地使系统静音,但如果您需要恢复状态(例如,当用户暂停/退出您的应用程序时),请注意 adjustStreamVolume
和 [=13 的语义=] 方法不同:
对于 setStreamMute
,来自文档:
The mute requests for a given stream are cumulative: the AudioManager can receive several mute requests from one or more clients and the stream will be unmuted only when the same number of unmute requests are received.
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
//
audioManager.setStreamMute(stream, false);
}
这假设用户不太可能调用另一个应用来静音中间的流,并期望在您的应用取消静音后流保持静音(无论如何似乎没有办法检查这一点)。
顺便说一句,isStreamMute
方法以前是隐藏的,只是在 API 23 中才取消隐藏,因此可以用于此目的。