我构建了一个小型应用程序,它使用类 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;
}
}
最佳答案
首先要注意it's not recommended
For a better user experience, applications MUST unmute a muted stream in onPause() and mute it again in onResume() if appropriate.
但我假设您知道自己在做什么,所以我们开始吧。
请注意 setStreamMute 上文档中的这一行
The mute command is protected against client process death: if a process with an active mute request on a stream dies, this stream will be unmuted automatically.
我检查了我的设备,确实,当我刚刚退出我的 Activity 时,流保持静音。但是,一旦我终止了该过程,静音就会消失。 看看activity lifecycle .
由于您当前的方法无法可靠地工作,您可以编写 foreground service这将触发静音 - 从您的 Activity 中启动该服务。 此外,您可能需要 setStreamSolo .
两件重要的事情。
Volume==0
和muted
不是一回事。 IE。流可以有 volume==0 但不能静音。尽管如果流 静音,音量将始终为 0- 静音请求是累积的。 IE。如果您设置了两次静音,您也必须取消静音两次 - 您的代码无法处理该问题
附带说明一下,对于此类应用,您可能希望使用小部件而不是 Activity 。
题外话。令人惊讶的是,很多人似乎并不完全了解 bool 值的工作原理。 正如我经常看到的代码,例如您的代码,这里有一些简化的重写。
@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 - Android 中的静音流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101624/