数ヶ月前、私はベルギーからの素晴らしいボルボV50車を持っていました。 オンボードコンピューターとラジオテープレコーダーは、正規のディーラーによってロシア語にフラッシュされましたが、標準のスピーカーフォンを使用しているときに携帯電話のノートブックからロシア語の名前が表示されるため、すべてのキリル文字がアンダースコアとして表示されました。 私はCyanogenMod 11のファームウェアでSamsung Galaxy S3を使用しています。そのため、呼び出し元の名前が見えるように、標準のBluetooth.apkを調整することを考えました。
小規模な研究では、主に車が2種類のプロファイルを使用して電話帳エントリを取得することが示されました。
- PBAP-電話帳アクセスプロファイル
- HFP-ハンズフリープロファイル
1つ目はより洗練され、ほとんどすべての連絡先情報(名前、姓、組織、電子メールアドレスなど)を含むvCard形式でデータを送信します。
2番目は、名前、電話番号、およびノートブックIDのみを送信します。
システムログを分析すると、私の車はATコマンドによる通信でHFPを使用していることがわかりました。 次のファイルがこのプロファイルを担当します/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/AtPhonebook.java
短い検索の後、 int processCpbrCommand(BluetoothDeviceデバイス)関数が見つかります。関数の最後には、コマンドに対する応答文字列が形成されます。
record = "+CPBR: " + index + ",\"" + number + "\"," + regionType + ",\"" + name + "\""; record = record + "\r\n\r\n"; 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 + "\r\n\r\n";
Bluetoothアプリケーションをコンパイルし、CMファームウェアを使用してアーカイブに貼り付けるだけです。
再フラッシュ後のテストでは、ソリューションが完全に機能していることが示されました。 これで、ノートブックのすべての名前が音訳で表示されます。
ターンキーソリューションを見つける過程で、PBAPプロファイルに問題があり、やはりXC60などのボルボ車に問題があることが判明しました。
この車のハンズフリーモジュールはCP1251エンコーディングを使用しますが、Androidの標準のBluetooth電話アプリケーションは、アンダースコアによるデータの表示で表現されるUTF-8エンコーディングのPBAPプロファイルを介してデータを送信します。
この問題を解決するには、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関数)
残念ながら、PBAPを使用しているXC60などのマシンはまだないため、確認できませんでした。
Bluetooth.apkを再構築するためのオプションをいくつか追加しました
- Translite HFP( http://yadi.sk/d/QlGKIPfXLMNXx )
- CP1251 PBAP( http://yadi.sk/d/qrbUVrtuLMRan )
このソリューションは、ロシア語を理解しないスピーカーフォンを内蔵した他の車の所有者にも役立ちます。