已弃用的 AudioManger.setStreamMute 的替代方案?
Posted
技术标签:
【中文标题】已弃用的 AudioManger.setStreamMute 的替代方案?【英文标题】:Alternative for deprecated AudioManger.setStreamMute? 【发布时间】:2016-01-08 12:48:11 【问题描述】:AudioManger.setStreamMute 现在被 api 23 弃用,最好使用 AudioManager.adjustStreamVolume
和 AudioManager.ADJUST_MUTE.
我的问题是这种标志只支持 api 23 而我的应用程序最低 api 16。
还有其他方法可以使整个系统静音吗?
如果不是,为什么 google 会弃用这种方法?
【问题讨论】:
【参考方案1】:我的做法是使用 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);
【讨论】:
但是对于小于 23 的 api,难道不应该有更好的解决方案吗? 这就是解决方案。如果 API 小于 23,else 将执行。我可以让它变得更好的唯一方法是将它包装在一个方法中。 通过说一个小于 23 的 api 更好的解决方案,我的意思是一种不被弃用的方法 - 'setStreamMute' 的替代方案。我知道可能没有,谢谢。 setStreamMute 在以前的版本中不被弃用。仅在 API 23 上。如果应用程序在使用低于 23 的 API 的手机上运行,它将按预期工作。setStreamVolume
没有被弃用,那么调整过度设置是否有优势?两者都支持相同的语法。【参考方案2】:
接受的答案在使系统静音时效果很好,但是如果您需要恢复状态(例如当用户暂停/退出您的应用程序时),请注意 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://***.com/questions/7908962/setstreammute-never-unmutes?rq=1
audioManager.setStreamMute(stream, false);
这假设用户不太可能调用另一个应用来将流静音,并期望在您的应用取消静音后流保持静音(无论如何似乎没有办法检查这一点)。
顺便说一句,isStreamMute
方法之前是隐藏的,只是在 API 23 中未隐藏,因此可以将其用于此目的。
【讨论】:
以上是关于已弃用的 AudioManger.setStreamMute 的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章