当状态改变时,如何关闭MediaRecorder播放的声音

时间:2011-07-24 00:30:38

标签: android audio media record

我的Android应用程序在SurfaceHolder上使用MediaRecorder来显示相机捕获内容的实时预览。每次用户按下应用程序上的REC按钮,应用程序就会开始记录。 每次MediaRecorder的状态切换到'start'时,Android会自动(?)发出蜂鸣声。这种哔哔声听起来与手机不同,这让我觉得这种哔哔声本身就与MediaRecorder的状态变化有关。 如果手机的音量设置为静音,则不会发出哔声。

我谷歌并做了一些研究,但我找不到一种方法来打开这个哔哔声。可能吗?如果是这样,怎么样?

该应用程序已经过测试:Nexus One 2.3.4,Desire HD 2.3.3

5 个答案:

答案 0 :(得分:7)

好的,接受的答案对我不起作用。在通过MediaRecorder录制时运行4.2.1(Jelly Bean)的Galaxy Nexus我需要使用AudioManager.STREAM_RING,因为AudiManager.STREAM_SYSTEM不起作用。在每次录制开始时,它总是会发出“响声”声。

这是我使用“STREAM_RING”和其他人的解决方案。

// disable sound when recording.
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_ALARM,true);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_DTMF,true);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_MUSIC,true);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_RING,true);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_SYSTEM,true);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_VOICE_CALL,true);

// re-enable sound after recording.
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_ALARM,false);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_DTMF,false);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_MUSIC,false);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_RING,false);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_SYSTEM,false);
((AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_VOICE_CALL,false);

同样,documentation状态确保在onPause()方法中重新启用音频。

我希望这有助于有人在这个问题上撕掉他们的头发。这会禁用所有声音流。您可以通过并找出您特别需要的那些。我发现不同版本的android在mediarecorder运行时使用不同的流来进行编钟。即,STREAM_RING适用于Android 4.2.1,但对于ICS,它不起作用。

编辑:正如我在下面提到的评论,我无法在三星Galaxy S1上禁用Android OS 2.3.3的声音。有谁幸运吗?

Darrenp的解决方案有助于整理代码,但在我最近的手机更新(galaxy nexus android 4.3)中,音量/录音哔声再次启动! user1944526的解决方案绝对有帮助。为了使其更容易理解......

使用类似的东西,

// class variables.
Integer oldStreamVolume;
AudioManager audioMgr;


enableSound() {
        setMuteAll(false);
        if (audioMgr != null && oldStreamVolume != null) {
            audioMgr.setStreamVolume(AudioManager.STREAM_RING, oldStreamVolume, 0); 
        }
}

disableSound() {
        audioMgr = (AudioManager)activity.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        oldStreamVolume = audioMgr.getStreamVolume(AudioManager.STREAM_RING);
        audioMgr.setStreamVolume(AudioManager.STREAM_RING, 0, 0);       

}

为了完整性,您还可以在函数中调用darrenp的解决方案或包含所有上述STREAM_行。但对我来说,这些结合起来正在发挥作用。希望这有助于某人...

答案 1 :(得分:4)

尝试

((AudioManager)context.getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_SYSTEM,true);

所有声音都静音。

答案 2 :(得分:4)

从@ wired00的回答开始,代码可以简化如下:

private void setMuteAll(boolean mute) {
    AudioManager manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

    int[] streams = new int[] { AudioManager.STREAM_ALARM,
        AudioManager.STREAM_DTMF, AudioManager.STREAM_MUSIC,
        AudioManager.STREAM_RING, AudioManager.STREAM_SYSTEM,
        AudioManager.STREAM_VOICE_CALL };

    for (int stream : streams)
        manager.setStreamMute(stream, mute);
}

现在可以正常工作但如果将来引入更多流,则此方法可能需要更新。更强大的方法(尽管可能有点过分)是使用反射来获取所有STREAM_ *静态字段:

List<Integer> streams = new ArrayList<Integer>();
Field[] fields = AudioManager.class.getFields();
for (Field field : fields) {
     if (field.getName().startsWith("STREAM_")
         && Modifier.isStatic(field.getModifiers())
         && field.getType() == int.class) {
         try {
             Integer stream = (Integer) field.get(null);
             streams.add(stream);
         } catch (IllegalArgumentException e) {
              // do nothing
         } catch (IllegalAccessException e) {
             // do nothing
        }
    }
}

有趣的是,似乎有一些未记录的流,即STREAM_BLUETOOTH_SCO,STREAM_SYSTEM_ENFORCED和STREAM_TTS。我猜/希望这些也没有什么害处!

答案 3 :(得分:2)

我在运行Android 4.2.1的Lenovo K900上遇到此问题。 setStreamMute似乎对我没有任何作用,但是setStreamVolume可以工作......

AudioManager audioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int oldStreamVolume = audioMgr.getStreamVolume(AudioManager.STREAM_RING);
audioMgr.setStreamVolume(AudioManager.STREAM_RING, 0, 0);
... do recording ...
audioMgr.setStreamVolume(AudioManager.STREAM_RING, oldStreamVolume, 0);

答案 4 :(得分:1)

在开始之前添加此代码:

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
audioManager.setStreamMute(AudioManager.STREAM_MUSIC,true);

在停止后添加此代码:

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false);
audioManager.setStreamMute(AudioManager.STREAM_MUSIC,false);

有些国家/固件使用STREAM_SYSTEM,其他国家/固件使用STREAM_MUSIC。还有一些国家这是非法的,但使用不同的渠道。