我的Android应用程序在SurfaceHolder上使用MediaRecorder来显示相机捕获内容的实时预览。每次用户按下应用程序上的REC按钮,应用程序就会开始记录。 每次MediaRecorder的状态切换到'start'时,Android会自动(?)发出蜂鸣声。这种哔哔声听起来与手机不同,这让我觉得这种哔哔声本身就与MediaRecorder的状态变化有关。 如果手机的音量设置为静音,则不会发出哔声。
我谷歌并做了一些研究,但我找不到一种方法来打开这个哔哔声。可能吗?如果是这样,怎么样?
该应用程序已经过测试:Nexus One 2.3.4,Desire HD 2.3.3
答案 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。还有一些国家这是非法的,但使用不同的渠道。