Дружим штатную громкую связь Volvo с русскими буквами из песочницы

Доброго времени суток!

Несколько месяцев назад появился у меня чудесный автомобиль Volvo V50 родом из Бельгии. Бортовой компьютер и магнитолу успешно перепрошили на русский язык у официального дилера, а вот с отображением русских имен из записной книжки телефона при использовании штатной громкой связи вышла беда: все кириллические символы показывались в виде подчеркиваний. Я пользуюсь Samsung Galaxy S3 прошитым CyanogenMod 11, поэтому возникла идея подправить стандартный Bluetooth. apk для обеспечения возможности видеть имя звонящего.

Небольшое исследование показало, что в основном автомобили используют два вида профилей для получения записей телефонной книги:

  • PBAP — Phone Book Access Profile
  • HFP — Handsfree Profile

Первый является более навороченным и передает данные в формате vCard, который включает в себя практически все данные о контакте: имя, фамилию, организацию, адрес электронной почты и так далее.

Второй отправляет только имя, телефон и идентификатор записной книжки.

Путем анализа логов системы выяснилось, что мой автомобиль использует HFP с общением посредством AT-команд. За данный профиль отвечает следующий файл /packages/apps/Bluetooth/src/com/android/bluetooth/hfp/AtPhonebook. java

После недолгих поисков находим функцию int processCpbrCommand(BluetoothDevice device). в конце которой происходит формирование строки ответа на команду:

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

После этого нужно вызвать функцию при передаче команды:

Теперь остается лишь скомпилировать приложение Bluetooth и вставить в архив с прошивкой CM.

Тесты после перепрошивки показали полную работоспособность решения. Теперь все имена из записной книжки отображаются транслитом.

В процессе поиска готового решения выяснилось, что проблемы бывают и с профилем PBAP, опять же с автомобилями Volvo, например XC60.

Модуль громкой связи в данном авто использует кодировку CP1251, тогда как стандартное приложение Bluetooth телефона на Android передает данные по профилю PBAP с указанием кодировки UTF-8, что выражается в отображении данных символами подчеркивания.

Для решения данной проблемы можно изменить конструктор класса BluetoothPbapVcardComposer (/packages/apps/Bluetooth/src/com/android/bluetooth/pbap/BluetoothPbapVcardComposer. java )

Здесь можно явно задать кодировку для суперкласса.

В принципе можно попробовать провернуть трюк с транслитерацией и здесь, копать нужно в сторону формирования vCard (функция buildVCard)

К сожалению XC60 или другой машины, использующей PBAP, у меня пока нет, поэтому проверить не смог.

Прикладываю пару вариантов пересобранного Bluetooth. apk

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