在 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==0muted 不是一回事。 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 中静音流的主要内容,如果未能解决你的问题,请参考以下文章

EDIUS中静帧图片该如何做出动态特效

不甘心才是你一直在努力的理由

VC++基于微软语音引擎开发语音识别总结

导航到另一个视图 iPhone sdk?

如何在Android中启动JAVA程序

Android - 在 Android 1.6 中开发的应用程序可以在 Android 2.0 中运行吗?