移植原理基于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.matchedCombinationcom.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.DialNameMatchercom.android.dialer.dial.SmartDialPrefix.generateNamePrefixes ->com.android.dialer.smartdial.SmartDialPrefix2.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中文拨号功能完美实现
版权声明:本文为weixin_42119086原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。