Intereting Posts
Как использовать com.android.databinding в модуле (студия Android)? Как Android управляет памятью? Установка содержимогоInset в RecyclerView Почему SwitchPreference не отображает анимацию при переключении с включенного на off и наоборот? Gson сериализуется в LinkedTreeMap вместо моего объекта Получить элемент, выбранный в списке, когда я создаю контекстное меню Переопределите фоновый атрибут include, чтобы изменить цвет фона Android SDK менеджер не показывает пакеты, которые будут установлены Показать и скрыть панель действий при прокрутке содержимого пейджера Список местных: MvxBind binders Android Studio ошибка установки Gradle Расширение размера экземпляра виртуального устройства Android (эмулятора)? Как использовать WebRTC + Pubnub Api для клиента видеочата в приложении для собственного андроида Пользовательский выбранный цвет текста вкладки в SlidingTabLayout FATAL EXCEPTION: главная java.lang.NoClassDefFoundError: com.google.analytics.tracking.android.EasyTracker

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

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

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

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

    пытаться

    ((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. Есть также страны, где это незаконно, но используют другой канал.