LINUX.ORG.RU
ФорумMobile

При входящем звонке звук идёт и в наушники, и в динамики

 


0

1

Samsung i9192, Android 4.2.2, стандартная прошивка, есть root. При подключённых проводных наушниках при входящем вызове звук рингтона также идёт на динамики. Хочу, чтобы при воткнутых наушниках все звуки шли только на наушники. Как это сделать?

На всех виденных мной Android'офонах всегда звук шёл и туда, и сюда. Помнится, на стареньком SE K610i политика звуковых оповещений менялась сменой звукового профиля. Возможно, и на Android'е так же. Проверьте.

carasin ★★★★★
()
Ответ на: комментарий от ArtKun

На динамики звук идти и не должен.

Именно на этом телефоне?

Прошивку в студию.

Прошивка стандартная от самсунга, версия I9192XXUAMF9, уже была на телефоне при покупке. От стандартной отличается только тем, что я прошил CWM recovery для получения рута (прошивал из heimdall), но это ведь не должно влиять на нормальную работу.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от carasin

Помнится, на стареньком SE K610i политика звуковых оповещений менялась сменой звукового профиля. Возможно, и на Android'е так же. Проверьте.

На убогом андроиде нет профилей, как были на старых обычных телефонах.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от Dantix

Они там есть, так что кто убогий - это вопрос

В каком месте? На моём телефоне ничего такого нет.

gentoo_root ★★★★★
() автор топика

выкинь яблоконаушники и/или поставь приличную прошивку, вместо того, что ты накатил недавно@тред ничитал, вангую

sudoer
()
Ответ на: комментарий от sudoer

выкинь яблоконаушники

Мимо, попробовал все наушники, которые у меня были.

поставь приличную прошивку, вместо того, что ты накатил недавно

Ничего не накатывал, стоит стандартная, которая была при покупке.

gentoo_root ★★★★★
() автор топика

Кажется, нашёл нужное место в исходниках (строка 722):

https://android.googlesource.com/platform/frameworks/base/ /105925376f8d0f6b3...

Если бы там вместо этого:

                on ? ROUTE_HEADSET | ROUTE_SPEAKER : ROUTE_SPEAKER, ROUTE_ALL & ~ROUTE_BLUETOOTH_A2DP);

было это:

                on ? ROUTE_HEADSET : ROUTE_SPEAKER, ROUTE_ALL & ~ROUTE_BLUETOOTH_A2DP);

то всё работало бы, как надо. Теперь остаётся вопрос, как вызвать настоящую функцию setRouting из приложения для android. AudioManager.setRouting не работает, она deprecated и пустая:

https://github.com/android/platform_frameworks_base/blob/master/media/java/an...

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от gentoo_root

Костыльное решение, которое я вижу: повесить BroadcastReceiver на TelephonyManager.ACTION_PHONE_STATE_CHANGED, и когда телефон начнёт звонить, сделать:

AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_NORMAL);

Должно сработать, сейчас проверю, если не сработает — напишу.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от gentoo_root

Удивительно, но не сработало, хотя если я ставлю MODE_IN_CALL, то рингтон идёт через маленький разговорный динамик. Буду придумывать костыли дальше.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Все телефоны, которые у меня были, вели себя точно так же.

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

Но самая главная причина — я хочу, чтобы при воткнутых наушниках озвучивалось имя звонящего (телефон в кармане, хочу не доставать его), а без наушников — не озвучивалось (всё равно телефон нужно взять, тогда и посмотрю, а ещё окружающие не должны слышать имя звонящего). Я начал писать такую программу (те озвучивалки, что в маркете, не умеют различать состояние наушников и не подходят по другим причинам) и столкнулся с кучей проблем, связанных с реализацией звука в андроиде. А потом вообще оказалось, что рингтон всегда идёт на динамик, поэтому моя изначальная затея неосуществима, если не исправить это.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от gentoo_root

Моя старая нокия так себя не вела

А моя 5530 вела. В любом случае, желаю чтобы твой патч приняли в апстрим. На мой дилетанский взгляд, при запуске твоего приложения можно отключить звук звонка вообще (когда подключены наушники) и во время звонка просто воспроизводить мелодию звонка через наушники, как обычный плеер, а при отключении наушников возвращать все в зад. Не придется бодаться с разработчиками, что, как мне кажется, большой плюс — недавно отправил патч в Apache Commons Lang, но когда его увидят и примут ли вообще — большой вопрос. =/

f1xmAn ★★★★★
()
Ответ на: комментарий от f1xmAn

В любом случае, желаю чтобы твой патч приняли в апстрим.

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

На мой дилетанский взгляд, при запуске твоего приложения можно отключить звук звонка вообще (когда подключены наушники) и во время звонка просто воспроизводить мелодию звонка через наушники, как обычный плеер, а при отключении наушников возвращать все в зад.

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

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от gentoo_root

В андроиде нету Listener'ов на изменение профилей звука? Ну, на входящий звонок-то наверняка есть Listener, т.ч. можно вырубать звук как раз при получении необходимого event'а.

f1xmAn ★★★★★
()
Ответ на: комментарий от f1xmAn

Ну, на входящий звонок-то наверняка есть Listener, т.ч. можно вырубать звук как раз при получении необходимого event'а.

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

Ещё узнал, что в cyanogenmod можно настроить поведение при звонке (можно включить или выключить звук через динамики при воткнутых наушниках), пытаюсь понять, как оно там работает, увидел, что настройка хранится в свойстве persist.sys.ring-speaker, но пока что не нашёл, где оно читается и используется.

gentoo_root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.