AudioManager.getMode () Android кажется ненадежным.Та же ситуация дает разные результаты - PullRequest
2 голосов
/ 11 февраля 2012

В настоящее время я работаю над аудиопроигрывателем, который должен приостанавливаться / останавливаться при потере звукового фокуса, например, при поступлении вызова.

В то время как у меня все работает нормально с помощью OnAudioFocusChangeListener, я хочуулучшите эту функцию, чтобы она велась по-разному при различных обстоятельствах.

Поскольку в приложении реализована функция тайм-аута в случае, если пользователь заснул во время прослушивания, я хочу возобновить воспроизведение только тогда, когда я могу быть уверен, что пользователь еще не спит.

Я подумал, что могу в значительной степени игнорировать звуки уведомлений, похожие на звуки входящего электронного письма, так как обычно это всего лишь короткие клипы, и мое воспроизведение звука по-прежнему не доставляет неудобств пользователю, как это было бы во времятелефонный звонок.Таким образом, я хочу ограничить паузу / остановку ситуацией, когда либо поступает телефонный звонок, либо пользователь делает звонок.

Я видел, что AudioManager имеет несколько удобных состояний, чтобы сигнализировать об этом, но после вызова AudioManager.getMode () в моем OnAudioFocusChangeListener я не получаю последовательный вывод.Иногда входящий вызов генерирует MODE_RINGTONE, но достаточно часто, чтобы сделать функцию ненадежной, я получаю MODE_NORMAL.

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

Единственное реальное устройство, на котором я мог проверить это поведение, это Galaxy S2, работающий под управлением Android 2.3.6 (приложение API уровня 10 из-за того, что я используюMediaMetadataRetriever, таким образом, требует по крайней мере 2.3.3).Я проверил потерю и повторное усиление фокусировки звука в различных эмулируемых системах, и в целом он, кажется, работает лучше, но я также не получаю одинаковые результаты каждый раз.

Может быть, проблемав том, что я неправильно понимаю, что AudioManager.getMode () должен возвращать, может быть, кто-то может уточнить это для меня:

  1. телефон звонит -> AudioManager.getMode () должен вернуть MODE_RINGTONE при потере фокуса
  2. пользователь совершает или принимает вызов -> AudioManager.getMode () должен вернуть MODE_IN_CALL при потере фокуса
  3. не принимает вызов -> AudioManager.getMode () должен вернуть MODE_RINGTONE при усилении фокуса
  4. пользователь вешает трубку -> AudioManager.getMode () должен возвращать MODE_IN_CALL при усилении фокуса

Это так, как это должно работать?По крайней мере, мои тесты показывают, что так и должно быть, но по некоторым причинам это происходит не всегда.

Другой способ, с помощью которого я пытаюсь решить эту проблему, - это использование PhoneStateListener, ноПроблема, с которой я столкнулся, заключается в том, что для этого требуется, чтобы мое приложение запросило разрешение на чтение состояния телефона.Поскольку я делюсь своим приложением, в настоящее время через SourceForge, позже, возможно, через Android Market, я бы хотел избежать использования такого рода разрешений.

Итак, заканчивая, я хотел бы спросить, как мнеЯ понимаю, что AudioManager.getMode () является верным, и если есть какая-либо информация о его надежности, то для меня результаты, которые я получаю от него, являются несколько бесполезными.

...