安卓8.1 AEX5.4 Xposed框架T9撥號移植

移植原理基於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中文撥號功能完美實現


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章