从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅
起因
最近做的APP中有一个新功能:已知用户微信号,可点击直接跳转到当前用户微信聊天窗口页面。
当时第一想法是使用无障碍来做,并且觉得应该不难,只是逻辑有点复杂。没想到最终踩了好多坑,特地把踩过的坑记录下来。
实现逻辑
在APP中点击按钮→跳转到微信界面→模拟点击微信搜索按钮→在微信搜索页面输入获取的微信号→模拟点击查询到的用户进入用户聊天界面。
效果图
实现过程
跳转微信按钮点击事件
jumpButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_MAIN);
ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(cmp);
startActivity(intent);
}
});
无障碍监听主要方法
一些必要的参数
/**
* 微信主页面的“搜索”按钮id
*/
private final String SEARCH_ID = "com.tencent.mm:id/ij";
/**
* 微信主页面bottom的“微信”按钮id
*/
private final String WECHAT_ID = "com.tencent.mm:id/d3t";
/**
* 微信搜索页面的输入框id
*/
private final String EDIT_TEXT_ID = "com.tencent.mm:id/ka";
/**
* 微信搜索页面活动id
*/
private String SEARCH_ACTIVITY_NAME = "com.tencent.mm.plugin.fts.ui.FTSMainUI";
private String LIST_VIEW_NAME = "android.widget.ListView";
微信组件的id之前有博客说过如何获取,所以在此就不重复说明了。
监听主要方法
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
List<AccessibilityNodeInfo> searchNode = event.getSource().findAccessibilityNodeInfosByViewId(SEARCH_ID);
List<AccessibilityNodeInfo> wechatNode = event.getSource().findAccessibilityNodeInfosByViewId(WECHAT_ID);
if (searchNode.size() > 1) {
// 点击“搜索”按钮
if (searchNode.get(0).getParent().isClickable()) {
searchNode.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
return;
}
} else if (searchNode.size() == 1) {
// 如果在“我”页面,则进入“微信”页面
for (AccessibilityNodeInfo info : wechatNode) {
if (info.getText().toString().equals("微信") && !info.isChecked()) {
if (info.getParent().isClickable()) {
info.getParent(