如何closuresMediaRecorder在状态改变时播放的声音

我的Android应用程序使用SurfaceHolder上的MediaRecorder来显示相机捕捉的实时预览。 每当用户按下应用程序上的RECbutton,应用程序开始logging。 每当MediaRecorder的状态切换到“开始”时,Android会自动(?)发出哔声。 这个嘟嘟声听起来不同于手机,这让我觉得这个嘟嘟声本身就是附着在MediaRecorder的状态变化上的。 如果手机的音量设置为无声,则不会播放哔声。

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

该应用程序进行了testing:Nexus One 2.3.4,Desire HD 2.3.3

Solutions Collecting From Web of "如何closuresMediaRecorder在状态改变时播放的声音"

尝试

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

把所有的声音都静音。

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

这是我的解决scheme使用“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); 

同样, 文档状态一定要在onPause()方法中重新启用audio。

我希望这可以帮助有人在这个问题上撕裂自己的头发。 这将禁用所有声音stream。 你可以通过并找出你特别需要的那个。 我发现当mediarecorder运行时,不同版本的android使用不同的stream媒体。 即,STREAM_RING适用于android 4.2.1,但对于ICS则不起作用。

编辑:正如我下面的评论提到的,我不能让Android OS 2.3.3在三星Galaxy S1的禁用声音。 任何人都有这个运气?

Darrenp的解决scheme有助于整理代码,但在最近更新到我的手机(galaxy nexus android 4.3)音量/录音哔声再次启动! user1944526解决scheme肯定有帮助。 为了更容易理解…

使用类似的东西,

 // 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的函数解决scheme,或者包含上面所有的STREAM_行。 但是现在对我来说,这些结合在一起工作。 希望这可以帮助别人…

继@wire的答案之后,代码可以简化如下:

 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,这个方法可能需要更新。 更健壮的方法(尽pipe也许矫枉过正)是使用reflection来获得所有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 } } } 

有趣的是,似乎有一些没有logging的stream,即STREAM_BLUETOOTH_SCO,STREAM_SYSTEM_ENFORCED和STREAM_TTS。 我猜/我希望这样做也没有什么坏处!

运行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); 

在开始之前添加此代码:

 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。 也有国家这是非法的,但使用不同的渠道。