我已经构建了一个使用类 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
但我假设你知道你在做什么,所以我们开始吧。
请注意 setStreamMute 上的文档中的这一行
我已经检查了我的设备,确实,当我刚刚退出我的 Activity 时,流保持静音。但是,一旦我杀死了进程,静音就会消失。
看看 activity lifecycle 。
由于您当前的方法无法可靠地工作,您可以编写一个 foreground service 来触发静音 - 从您的 Activity 中启动该服务。
此外,您可能需要 setStreamSolo 。
两个重要的 事情。
Volume==0
和 muted
不是一回事。 IE。流可以有 volume==0 但不能静音。虽然如果流被静音,音量将始终为 0 作为旁注,对于此类应用程序,您可能希望使用小部件而不是 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);
}