Intereting Posts
AlphabetIndexer с пользовательским адаптером, управляемый LoaderManager Android обнаруживает на ощупь внутри фрагмента Ошибка раздувания класса com.facebook.widget.LoginButton с Facebook SDK 4.0.1 Как уменьшить размер большого размера до размера миниатюр в android Autolink внутри TextView в android Как отключить Android LocationListener, когда приложение закрыто Ограничение размера файлов Android Market. 50 МБ или 4 ГБ? Android эквивалентен CocoaPods Pods-Acknowledgements.plist? Как изменить цвет текста в TextView при наведении, как в css? Как избежать использования экранной клавиатуры для редактирования EditText в андроиде Android – Установить идентификатор фрагмента НЕОПРЕДЕЛЕННОЕ ТОП-УРОВЕННОЕ ИСКЛЮЧЕНИЕ: com.android.dex.DexException: несколько файлов dex определяют Перехват телефонных звонков для отображения информации о контакте Что означает верхнее, левое, правое и нижнее значение в объекте Android Rect Android: Можно ли включить / отключить фильтр намерений активности программно?

Обнаруживать отсутствие наушника (только для громкой связи) на устройстве Android

У меня есть приложение, которое отображает кнопку переключения громкой связи при использовании на телефоне. Тумблер переключает маршрутизацию звука между динамиком телефона и громкой связью. Однако, когда приложение запускается на планшете (или на любом устройстве, у которого отсутствует наушник), я бы хотел удалить переключатель, так как все аудио передается через громкую связь.

В идеале, я хотел бы использовать какой-то isEarpiecePresent() , или, возможно, проверить флаг на каком-то объекте конфигурации, чтобы найти эту информацию, но я не могу найти что-либо подобного в API.

Я попытался обойти проблему, вызвав AudioManager.setSpeakerphoneOn(false) , а затем проверив AudioManager.isSpeakerphoneOn() , надеясь, что он все равно вернет true, и я мог бы отменить это. Система вернула значение false , хотя звук все еще прокладывается через динамик.

В настоящее время я думаю о проверке возможности телефонии, хотя это точно не подходит. Любые другие идеи?

Solutions Collecting From Web of "Обнаруживать отсутствие наушника (только для громкой связи) на устройстве Android"

Я исследовал это, и, к сожалению, я не могу найти поддержку API для определения того, существует ли динамик.

Теперь я добавил это с Google как запрос функции:
http://code.google.com/p/android/issues/detail?id=37623

Если вы согласны с этой функцией, нажмите на звезду внизу страницы с вопросом Google, чтобы проголосовать за нее!

Многие пользователи подняли вопрос о том, что Google Talk не предлагает вариант переключения динамиков / динамиков, что, возможно, предполагает отсутствие подходящего API …
http://code.google.com/p/android/issues/detail?id=19221

В качестве обходного пути вы можете скрыть эту функцию на устройствах, аппроксимированных (все эти подходы имеют недостатки):

  • Те с большими экранами (то есть планшеты)
  • Те, у кого нет поддержки телефонии
  • Используйте настраиваемый белый / черный список основных устройств, у которых нет наушника.

FTR, если вы используете этот ответ для маршрутизации звука на динамик, не кажется, что какая-либо отрицательная сторона влияет на работу этого кода на Xoom (OS 3.1) или на вкладке Galaxy Tab (OS 2.2) – звук просто продолжает Играть через внешний динамик. У меня не было возможности проверить, нет ли каких-либо взаимодействий с Bluetooth-гарнитурами.

Таким образом, уродливая часть – Google игнорирует проблему. Приятная часть заключается в том, что мне удалось выполнить проверку на наушники, а на 5/5 устройствах она работала нормально (протестировано на 5.0, 5.1, 6.0). И опять-таки, уродливая часть заключается в том, что это просто плохой, нестабильный код и что он взломан, но пока они не публикуют лучший API, я не мог бы сделать многое.

Вот взлом :

 private Boolean mHasEarpiece = null; // intentionally 'B' instead of 'b' public boolean hasEarpiece() { if (mHasEarpiece != null) { return mHasEarpiece; } // not calculated yet, do it now try { Method method = AudioManager.class.getMethod("getDevicesForStream", Integer.TYPE); Field field = AudioManager.class.getField("DEVICE_OUT_EARPIECE"); int earpieceFlag = field.getInt(null); int bitmaskResult = (int) method.invoke(mAudioManager, AudioManager.STREAM_VOICE_CALL); // check if masked by the earpiece flag if ((bitmaskResult & earpieceFlag) == earpieceFlag) { mHasEarpiece = Boolean.TRUE; } else { mHasEarpiece = Boolean.FALSE; } } catch (Throwable error) { Log.e(TAG, "Error while checking earpiece! ", error); mHasEarpiece = Boolean.FALSE; } return mHasEarpiece; } 

Я открыт для улучшения редактирования, если у вас есть что-то лучше 🙂

Как вы теперь можете быть в курсе, это невозможно сделать с использованием текущего API Android.

Интерфейс Audio Hardware является фирменным, то есть написанным производителями для их аппаратного обеспечения, и должен поддерживать определенные вызовы системой Android, чтобы сделать его совместимым с приложениями, разработанными с помощью Android SDK.

Даже если вы найдете способ избежать поддержки API для одного устройства, это может не работать на всех устройствах. AudioManager.setSpeakerphoneOn(false) вашего AudioManager.setSpeakerphoneOn(false) может очень хорошо работать для устройств, поскольку все зависит от того, как был записан интерфейс Audio Hardware. Было бы предположение, что большинство планшетов будут обрабатывать звуковую маршрутизацию для динамика и динамика, если нет наушника.

Если вы хотите проверить код интерфейса Audio Hardware для Nexus 7, он здесь

 public boolean isEarPieceConnected() { AudioManager audio = (AudioManager) this .getSystemService(Context.AUDIO_SERVICE); if (audio.isWiredHeadsetOn()) { Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); return true; } else { Toast.makeText(this, "Not Connected", Toast.LENGTH_SHORT).show(); return false; } } 

Вы также можете проверить на audio.isSpeakerphoneOn ()

Я надеюсь, что это сработает, если я получу вашу проблему правильно.

Вы можете проверить это, используя Audio Manager

Аудио-менеджер

А также посмотреть

Головной набор подключен