Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

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

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

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

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

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

record = " CPBR: "   index   ",""   number   "","   regionType   ",""   name   """;
record = record   "rnrn";
atCommandResponse = record;
log("processCpbrCommand - atCommandResponse = " atCommandResponse);
mStateMachine.atResponseStringNative(atCommandResponse, getByteAddress(device));

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

private static final String[] charTable = new String[65536];
    static {
	charTable['А'] = "A";
	charTable['Б'] = "B";
	charTable['В'] = "V";
	charTable['Г'] = "G";
	charTable['Д'] = "D";
	charTable['Е'] = "E";
	charTable['Ё'] = "E";
	charTable['Ж'] = "ZH";
	charTable['З'] = "Z";
	charTable['И'] = "I";
	charTable['Й'] = "I";
	charTable['К'] = "K";
	charTable['Л'] = "L";
	charTable['М'] = "M";
	charTable['Н'] = "N";
	charTable['О'] = "O";
	charTable['П'] = "P";
	charTable['Р'] = "R";
	charTable['С'] = "S";
	charTable['Т'] = "T";
	charTable['У'] = "U";
	charTable['Ф'] = "F";
	charTable['Х'] = "H";
	charTable['Ц'] = "C";
	charTable['Ч'] = "CH";
	charTable['Ш'] = "SH";
	charTable['Щ'] = "SH";
	charTable['Ъ'] = "'";
	charTable['Ы'] = "Y";
	charTable['Ь'] = "'";
	charTable['Э'] = "E";
	charTable['Ю'] = "U";
	charTable['Я'] = "YA";

	for (int i = 0; i < charTable.length; i  ) {
	    char idx = (char) i;
	    char lower = new String(new char[] {idx}).toLowerCase().charAt(0);
	    if (charTable[i] != null) {
		charTable[lower] = charTable[i].toLowerCase();
	    }
	}
}

public static String toTranslit(String text) {
	char charBuffer[] = text.toCharArray();
	StringBuilder sb = new StringBuilder(text.length());
	for (char symbol : charBuffer) {
	    String replace = charTable[symbol];
	    sb.append(replace == null ? symbol : replace);
	}
	return sb.toString();
}

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

record = " CPBR: "   index   ",""   number   "","   regionType   ",""   toTranslit(name)   """;
record = record   "rnrn";

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

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

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

public BluetoothPbapVcardComposer(final Context context, final int vcardType,
    long filter, final boolean careHandlerErrors) {
    super(context, vcardType, "CP1251", careHandlerErrors);
    mVCardType = vcardType;
    mCharset = "CP1251";
    mFilter = filter;
}

Тут дозволено очевидно задать кодировку для суперкласса.
В тезисе дозволено испробовать провернуть трюк с транслитерацией и тут, копать необходимо в сторону образования vCard (функция buildVCard)
К сожалению XC60 либо иной машины, использующей PBAP, у меня пока нет, следственно проверить не сумел.

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

  1. Транслит HFP (http://yadi.sk/d/QlGKIPfXLMNXx)
  2. CP1251 PBAP (http://yadi.sk/d/qrbUVrtuLMRan)

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB