setMicrophoneMute (логический) не работает на некоторых устройствах - PullRequest
8 голосов
/ 07 марта 2011

Я не смог найти ни одного связанного поста здесь (но другие небольшие посты в интернете), поэтому вот он:

AudioManager.setMicrophoneMute (логический) ничего не делает на некоторых конкретных устройствах, которые япротестировано с: Google Nexus S, Samsung Galaxy S и Motorola Milestone.На любом другом устройстве он работает хорошо.

Он даже поддерживает свое «состояние» и возвращает логическое значение, как если бы он был отключен / включен, но он не отключен - микрофон продолжает запись - как в вызове GSM, так ив AudioRecord программная запись.Нет индикативного сообщения журнала.

Я также перепутал с разрешениями (android.permission.MODIFY_AUDIO_SETTINGS, android.permission.RECORD_AUDIO), здесь ничего нового.

Кто-нибудь еще сталкивался с этим?У кого-нибудь есть обходной путь или волшебное решение?Если я использую AudioRecord, я просто реализую свое собственное отключение звука для этих устройств - я не передаю записанные буферы.Но это не может помочь мне приглушить микрофон в вызове GSM, который мне нужен.

Спасибо

---------------- Обновление----------------

См. Ниже.

Ответы [ 4 ]

5 голосов
/ 20 марта 2012

У меня была эта проблема, потому что я хотел редактировать файлы 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.

5 голосов
/ 23 февраля 2012

Привет, у меня была та же проблема, я хотел симулировать экран входящего вызова. и на этом экране кнопка, которая выполняет отключение звука, и AudioManager.setMicrophoneMute (логический) работал на большинстве телефонов, но не на всех. я нашел способ обойти это. Я имитирую нажатие кнопки отключения звука на гарнитуре. это сработало для меня, надеюсь, это поможет вам тоже вот код:

Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT,new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK));
getBaseContext().sendOrderedBroadcast(buttonUp,"android.permission.CALL_PRIVILEGED");
3 голосов
/ 03 июля 2011

Решение не найдено.Если записанный звук используется в качестве буфера данных, используйте данные PCM тишины (заполните нулями).Если вам необходимо программно отключить обычный телефонный звонок, сообщите пользователю, что это устройство требует ручного отключения звука с экрана вызова.

Я считаю это окончательным ответом, но, пожалуйста, удивите меня.

0 голосов
/ 10 марта 2012

Вы можете попробовать это:

AudioManager audioManager = ((AudioManager)context.getSystemService(Context.AUDIO_SERVICE));
    audioManager.setMode(AudioManager.MODE_NORMAL);
    if(state) //state-boolean 
    {
        audioManager.setMicrophoneMute(false);
        audioManager.setMode(AudioManager.MODE_IN_CALL);
        state= false;
    }
    else
    {
        audioManager.setMicrophoneMute(true);
        state = true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...