在 Android 中静音流
Posted
技术标签:
【中文标题】在 Android 中静音流【英文标题】:Muting streams in Android 【发布时间】:2012-10-17 14:04:50 【问题描述】:我已经构建了一个小应用程序,它使用 AudioManager
类将音乐流静音/取消静音。
事实上,它一直有效,直到我关闭应用程序。即我已经静音了流,我关闭了应用程序,我重新启动了应用程序并且按钮不再取消静音流。我在网上搜索过,但似乎没有人遇到过这个问题。
这是我的代码:
public class ControlloVolume extends Activity
ToggleButton tb_mute;
Button btn_mute;
AudioManager mAudioManager;
boolean mute;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_controllo_volume);
tb_mute = (ToggleButton) findViewById(R.id.tb_mute);
btn_mute = (Button) findViewById(R.id.btn_mute);
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0)
mute = true;
tb_mute.setChecked(mute);
else
mute = false;
tb_mute.setChecked(mute);
public void onButtonClicked(View view)
if(!mute)
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
tb_mute.setChecked(true);
mute = true;
else
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, false);
tb_mute.setChecked(false);
mute = false;
【问题讨论】:
当您说“关闭”时,您的意思是您的应用程序被销毁还是只是被放到了后台?重启应用时getStreamVolume是否返回0? 【参考方案1】:首先,小心it's not recommended
为了获得更好的用户体验,应用程序必须取消静音流 在 onPause() 中,如果合适的话,在 onResume() 中再次静音。
但我假设你知道自己在做什么,所以我们开始吧。
请注意setStreamMute上的文档中的这一行
静音命令受到保护以防止客户端进程死亡:如果 在流上具有活动静音请求的进程死亡,该流将 自动取消静音。
我检查了我的设备,确实,当我刚刚退出我的活动时,流保持静音。但是一旦我终止进程,静音就会消失。 看看activity lifecycle。
由于您当前的方法无法可靠地工作,您可以编写一个foreground service 来触发静音 - 从您的活动中启动该服务。 此外,您可能需要setStreamSolo。
两件重要的事情。
Volume==0
和 muted
不是一回事。 IE。流可以有 volume==0 但不能静音。虽然如果流 静音,音量将始终为 0
静音请求是累积的。 IE。如果您设置了两次静音,您也必须取消静音两次 - 您的代码无法处理此问题
附带说明,对于此类应用,您可能希望使用小部件而不是活动。
题外话。 令人惊讶的是,很多人并不完全了解布尔值的工作原理。 而且我经常看到像你这样的代码,这里有一些简化的重写。
@Override
public void onCreate(Bundle savedInstanceState)
// ... setup just like you did
// boolean is just like any other type. You can assign not only
// constants, but expressions too
mute = (mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0);
tb_mute.setChecked(mute);
public void onButtonClicked(View view)
mute = !mute; // invert value
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, mute);
tb_mute.setChecked(mute);
【讨论】:
说,android 6 (API 23) 的新 API for adjustStreamVolume 怎么样? “setStreamMute”已弃用,建议使用 adjustStreamVolume 。当应用程序被杀死时,音量的自动恢复是否仍然有效?发生了什么变化? @androiddeveloper 不知道,一年多没碰Android 现在看起来像这样:mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);用于静音,以及:mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE, 0);恢复正常以上是关于在 Android 中静音流的主要内容,如果未能解决你的问题,请参考以下文章