2012-10-27 55 views
5

我已经构建了一个小应用程序,使用类AudioManager将音乐流静音/取消静音。实际上,它在我关闭应用程序之前一直有效。即我已经静音了,我关闭了应用程序,重新启动了应用程序,并且按钮不再取消静音。我在网上搜索过,但似乎没有人遇到过这个问题。Android中的屏蔽流

这里是我的代码:

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; 
    } 
} 
+1

当你说“关闭”时,你的意思是说你的应用程序被销毁或放在后台?当您重新启动应用程序时,getStreamVolume是否返回0? – Michael

回答

0

首先,谨防it's not recommended

为了更好的用户体验,应用程序必须在的onPause(静音静音流 )和的onResume再次将其静音()如果合适的话。

但我假设你知道你在做什么,所以我们走了。

注意此线从所述文档上setStreamMute

静音命令针对客户端进程死亡的保护:如果一个 过程与上一个流的有源静音请求模具,这个流将 被自动取消静音。

我检查过我的设备,事实上,当我刚退出我的活动时,流保持静音。但只要我杀了这个过程,静音就会消失。 看看activity lifecycle。由于您当前的方法无法可靠运行,因此您可以编写一个foreground service,这将触发静音 - 从您的活动中启动该服务。 你也可能需要setStreamSolo

两个重要东西。

  1. Volume==0muted不是同一回事。即流可以有体积== 0但不能静音。虽然如果流静音,音量将始终为0
  2. 静音请求是累积的。即如果您将静音设置了两次,则您必须取消静音两次 - 您的代码无法处理该问题

请注意,对于此类应用程序,您可能希望使用小部件而不是活动。


偏离主题。似乎令人惊讶的是,很多人并不完全了解布尔值是如何工作的。 正如我看到的代码,如你的regulary,这里有点简化重写。

@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); 
} 
+1

说,adjustStreamVolume的Android 6(API 23)的新API怎么样? “setStreamMute”已弃用,建议使用adjustStreamVolume。自动还原音量是否仍然适用于应用程序被杀的时间?什么改变了? –

+0

@androiddeveloper不知道,我还没碰过Android一年左右 –

+0

哦。谢谢。 –