移植原理基於5.X時代DialerBox及GravityBox for 8.1.1
感謝waywell
DialerBox源碼地址:https://github.com/waynell/DialerBox
感謝C3C076
GravityBox8.1源碼地址:https://github.com/GravityBox/GravityBox/tree/oreo
編譯平臺macOS 10.13.4,使用IDE Andriod Studio 2.3
一、分析DialerBox源碼,分析實現原理
XposedHelpers.findAndHookMethod("com.android.dialer.dial.DialNameMatcher", classLoader,
"matchesCombination", String.class, String.class, ArrayList.class, new XC_MethodHook()
XposedHelpers.findAndHookMethod("com.android.dialer.dial.SmartDialPrefix", classLoader,
"generateNamePrefixes", String.class, new XC_MethodHook()
調用Xposed的findandhookmethod對
com.android.dialer.dial.DialNameMatcher.matchedCombination
com.android.dialer.dial.SmartDialPrefix.generateNamePrefixes
兩個類進行了hook操作,將傳入參數的displayname,調用安卓系統的HanziToPinyin類實現聯繫人中文漢字轉成拼音,從而進行T9識別(安卓系統原生支持英文T9識別)
二、具體實現
1.在AEX5.4(android 8.1)的src中,java路徑已經發生改變,首先修正java類路徑
com.android.dialer.dial.DialNameMatcher ->
com.android.dialer.smartdial.DialNameMatcher
com.android.dialer.dial.SmartDialPrefix.generateNamePrefixes ->
com.android.dialer.smartdial.SmartDialPrefix
2.DialerBox調用HanziToPinyin測試在AEX5.4中報錯,替代採用jpinyin1.1.6實現轉換,在bulid.gradle中添加
compile files('ext/jpinyin-1.1.6.jar')
3.插入修改後的函數
final String name = (String) param.args[0];
if (name == null) {
return;
}
param.args[0] = convertToPinyinString(name," ",WITHOUT_TONE);
對以上兩個方法進行hook,
在mi 5s(AEX5.4)測試成功,
同時對layout進行修改,添加相應設置項
T9中文撥號功能完美實現