Как отключить звук MediaRecorder воспроизводится при изменении состояния

Мое приложение Android использует MediaRecorder на SurfaceHolder, чтобы показать предварительный просмотр того, что камера захватывает. Каждый раз, когда пользователь нажимает кнопку REC в приложении, приложение начинает записывать. Каждый раз, когда состояние MediaRecorder переключается на / из «запуска», Android автоматически (?) Подает звуковой сигнал. Этот звуковой сигнал отличается от телефона к телефону, что заставляет меня думать, что этот звуковой сигнал связан с изменением состояния MediaRecorder. Звуковой сигнал не воспроизводится, если громкость телефона отключена.

Я google и сделал некоторые исследования, но я не мог найти способ отключить этот звуковой сигнал. Является ли это возможным? Если да, то как?

Приложение было протестировано на: Nexus One 2.3.4, Desire HD 2.3.3

Solutions Collecting From Web of "Как отключить звук MediaRecorder воспроизводится при изменении состояния"

пытаться

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

Это заглушает все звуки.

Хорошо, что принятый ответ не помог мне. На Galaxy Nexus Running 4.2.1 (Jelly Bean) при записи через MediaRecorder мне нужно было использовать 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); 

Также, как указано в документации, обязательно включите звук в onPause() .

Надеюсь, это поможет кому-то разрывать волосы над этой проблемой. Это отключает все звуковые потоки. Вы можете пройти и разработать, какие именно вам нужны. Я обнаружил, что разные версии android используют разные потоки для звонка, когда выполняется программа mediarecorder. Т.е. STREAM_RING работает для android 4.2.1, но для ICS он не работает.

Изменить: Как упоминается в моем комментарии ниже, я не могу отключить звук для Android OS 2.3.3 на Samsung Galaxy S1. Кому-то повезло с этим?

Решение 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_ . Но для меня сейчас эти комбинированные работают. Надеюсь, это поможет кому-то …

Следуя от ответа @ 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. Я угадываю / надеюсь, что в этом тоже нет вреда!

У меня просто была проблема с Lenovo K900 под управлением Android 4.2.1. 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. Есть также страны, где это незаконно, но используют другой канал.