当前位置:首页 > 资讯 > 正文

从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅

从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅

最近做的APP中有一个新功能:已知用户微信号,可点击直接跳转到当前用户微信聊天窗口页面。

当时第一想法是使用无障碍来做,并且觉得应该不难,只是逻辑有点复杂。没想到最终踩了好多坑,特地把踩过的坑记录下来。

在APP中点击按钮→跳转到微信界面→模拟点击微信搜索按钮→在微信搜索页面输入获取的微信号→模拟点击查询到的用户进入用户聊天界面。

跳转微信按钮点击事件:

无障碍监听主要方法:

一些必要的参数:

微信组件的id之前有博客说过如何获取,所以在此就不重复说明了。

监听主要方法:

这是最原始的版本,具体逻辑已在注释中说明。

最开始以为是赋值的方法有问题,但是在调试状态下能够赋值成功。因此猜测是因为UI加载太慢的缘故。

在搜索框还没完全加载完全的时候就进行了赋值,因此赋值不成功。

解决办法:

在赋值之前停顿300ms,在30行赋值前先停顿300ms。

由于监听是一直会进行的,因此只要进入了微信页面就会执行无障碍方法。这是不合理的。理论上应该在点击按钮进入微信才开始监听,而查找到好友之后就停止监听。

解决办法:

可以设置全局的变量用来控制监听。需要在点击按钮设置变量值为监听,而查找到微信好友之后设置为不监听。

全局变量:

按钮点击修改flag值:

根据flag判断是否需要监听:

在无障碍服务的监听方法中开始位置判断,

查询到结果后修改flag值:

想必大家都发现了,上面的处理方法还没有考虑到未查询到好友的情况。那么,未查询到好友如何停止监听呢?

最开始想的是找到未查询页面,只要知道了什么情况是未查询的,那就可以停止监听了。

但是未查询到好友的页面查找比较麻烦,因此想了一个取巧的办法。

解决办法:

写一个线程,两秒后执行,因为用户一般在未查询到结果页面会停留至少两秒,两秒误操作就停止监听。

线程实现(线程得是类持有的,而不应该是方法持有的):

监听方法内进行线程的开启操作:

由于无障碍的监听方法会反复执行,因此为了保证其正确性,需要保证在最后一次事件才开始计时。

最开始被这个问题难住了。后来产品给了我一个思路,其实很简单,如果判断当前页面并不是微信主页面的话,就执行全局返回按钮事件就行。

解决办法:

如果是页面改变事件,并且当前页面不是主页面也不是搜索页面(搜索页面就可以直接搜索了)的话,就执行全局返回键。

在解决上述问题时,又遇到了之前遇到的问题,UI加载太慢的问题,因此需要在每次页面改变事件中都得加上300ms的延迟时间。

解决办法:

解决了上述问题之后,又遇到了一个新的问题,经常性的返回到聊天页面就不返回了。

经过调试,发现聊天页面的活动和微信主页面的活动是同一个。

解决办法:

对聊天界面单独做处理,根据聊天界面左上角UI存在不存在来确定是否为聊天界面。

 其中USRENAME_ID为左上角备注部分的UIid。

经排查,发现搜索结果页面中的搜索布局提示布局id和首页面的搜索按钮id一致,因此就执行了点击搜索按钮的方法。

解决办法:

对于搜索按钮页面(主页面)也要进行单独判断,由于主页面一定有ViewPage布局,因此只要找到ViewPage那就证明是在主页面。

这个问题很奇怪,排查了半天也没发现为什么。这个问题主要出现在进入微信比较深的地方一步步返回之后。我发现找不到搜索按钮主要是通过id找直接就没找到。

于是就换了一种查找控件的方式。

解决办法:

将event.getSource()换成getRootInActiveWindow()。

经排查,发现在搜索结果页面直接更改输入框的查询值,如果值一样的话,不会触发任何的事件。出现该问题的原因就在这。

解决办法:

先清空输入框,再输入需要查询的微信号。

  • 任何一门技术都是说说容易,做做难。因为在实现过程中总会出现各种各样的问题;
  • 通过无障碍的方式来实现该功能效率低,并且不稳定,不知是否有更好的方法;
  • Android系统真的特别不安全!

 

 

最新文章