У меня была эта проблема, потому что я хотел редактировать файлы M4A, содержащие аудиоданные AAC.Я хотел иметь возможность объединить их и добавить тишину в качестве отступов.Из-за разницы в количестве миллисекунд на кадр на разных устройствах я решил отключить микрофон и записать секунду тишины, а затем повторять это снова и снова всякий раз, когда мне нужно было добавить паузу тишины.(Молчание M4A + AAC НАМНОГО сложнее, чем необработанный PCM).
К сожалению, я столкнулся с множеством различий приглушения звука на устройствах Android.Вот что я узнал:
- Приглушение будет молча завершаться ошибкой, если вы не используете разрешение MODIFY_AUDIO_SETTINGS.Нет сообщения об ошибке, просто не отключится
- Samsung Galaxy Tab 10.1 и Motorola Xoom работают так, как вы ожидаете.Вызовите audioManager.setMicrophoneMute (true) для отключения звука и audioManager.setMicrophoneMute (false) для включения звука
- HTC Inspire (с CyanogenMod 7) и Motorola Droid X неверно вернут true в audioManager.isMicrophoneMute, но на самом деле не будутприглушен.Чтобы это исправить, перед тем как отключить звук, вызовите audioManager.setMode (AudioManager.MODE_IN_CALL).ОЧЕНЬ обязательно верните режим на тот, который был изначально, как только вы закончите отключение звука - я не уверен, но похоже, что могут быть проблемы в других приложениях, если вы оставите его в неправильном режиме.
- Сенсорная панель HP, взломанная для двойной загрузки на CyanogenMod 7, совсем не любит отключение звука.Он создает бесполезные файлы записи, и вызовы audioManager.setMode () возвращаются в течение пяти секунд.
- HTC MyTouch 4G утверждает, что он отключен, но не отключается при любых условиях, которые я могу найти.
- HTC Flyer отключит звук, но как только вы вызовете mediaRecorder.start () или mediaRecorder.stop (), он включит звук самостоятельно.Вы можете отключить его снова, но сначала можете услышать доли секунды звука.
- Пряничные устройства, хотите вы того или нет, будут иметь между половиной секунды и секундой молчания в началелюбая запись MediaRecorder.Общая запись имеет правильную длину, эта первая часть просто глушится, а не захватывает то, что микрофон получал в то время.
В моем случае, чтобы создать файл молчания с соответствующим числом миллисекундПо кадрам, которые использует данное устройство (поэтому оно совместимо при объединении с другими аудиофайлами), я использую код, подобный следующему:
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int oldAudioMode = audioManager.getMode();
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setMicrophoneMute(true);
MediaRecorder mediaRecorder = new MediaRecorder();
int bitRate = 1000 * 160;
mediaRecorder.setAudioEncodingBitRate(bitRate);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(silenceFile.getAbsolutePath());
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setAudioSamplingRate(44100);
try {
mediaRecorder.prepare();
} catch (IOException ioe) {
throw new RuntimeException("could not prepare mediarecorder to create silence file",ioe);
}
mediaRecorder.start();
audioManager.setMicrophoneMute(true); //re-mute for devices like HTC Flyer that unmute
try {
Thread.sleep(SILENCE_LENGTH_MILLIS);
} catch (InterruptedException ie) {
throw new RuntimeException("could not record silence file", ie);
}
mediaRecorder.stop();
audioManager.setMicrophoneMute(false);
audioManager.setMode(oldAudioMode);
int currentVersion = android.os.Build.VERSION.SDK_INT;
if (currentVersion <= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
//cut out beginning half second and use that, since it's always silent on Gingerbread
} else {
//Honeycomb and up
//Take end of audio and use that--if the device unmuted itself there may be a little noise at the beginning
}
Это полное решение?Нет. Некоторые устройства просто НЕ будут отключены.Другие устройства, такие как ранее упомянутая сенсорная панель HP, вызывают новые проблемы, даже если вы пытаетесь отключить звук.Надеемся, что эти советы по крайней мере помогут людям отключить звук на большинстве устройств Android.