我已经构建了一个小应用程序,可以使用类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;
}
}
答案 0 :(得分:0)
首先,要注意it's not recommended
为了获得更好的用户体验,应用程序必须取消静音流的静音 在onPause()中,如果合适,在onResume()中再次静音。
但我猜你知道你在做什么,所以我们走了。
上的文档中的这一行静音命令可以防止客户端进程死亡:如果a 流上有活动静音请求的进程终止,此流将 自动取消静音。
我已经检查了我的设备,事实上,当我退出活动时,流保持静音。但是一旦我杀了这个过程,静音就会消失。 看看activity lifecycle。
由于您当前的方法无法可靠地运行,您可以编写一个foreground service来触发静音 - 从您的活动中启动该服务。 您也可能需要setStreamSolo。
两个重要的事情。
Volume==0
和muted
不是一回事。即stream可以有volume == 0但不要静音。但是,如果 <静音,则音量将始终为0 作为旁注,对于这样的应用程序,您可能希望使用小部件而不是活动。
偏离主题。看起来很多人并不太了解布尔的工作方式。 当我看到像你这样的代码时,这里有一些简化的重写。
@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);
}