功。
解决办法:
在赋值之前停顿300ms,在30行赋值前先停顿300ms。
1 try {
2 Thread.sleep(300);
3 } catch (InterruptedException e) {
4 e.printStackTrace();
5 }
2. 如何停止监听?
由于监听是一直会进行的,因此只要进入了微信页面就会执行无障碍方法。这是不合理的。理论上应该在点击按钮进入微信才开始监听,而查找到好友之后就停止监听。
解决办法:
可以设置全局的变量用来控制监听。需要在点击按钮设置变量值为监听,而查找到微信好友之后设置为不监听。
全局变量:
1 public class Constant {
2
3 /**
4 * 判断是否需要监听
5 */
6 public static int flag = 0;
7
8 /**
9 * 微信号
10 */
11 public static String wechatId;
12 }
按钮点击修改flag值:
1 jumpButton.setOnClickListener(new View.OnClickListener() {
2 @Override
3 public void onClick(View view) {
4 Intent intent = new Intent(Intent.ACTION_MAIN);
5 ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI");
6 intent.addCategory(Intent.CATEGORY_LAUNCHER);
7 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
8 intent.setComponent(cmp);
9 startActivity(intent);
10
11 Constant.flag = 1;
12 Constant.wechatId = editText.getText().toString();
13 }
14 });
根据flag判断是否需要监听:
在无障碍服务的监听方法中开始位置判断,
1 // 只有从app进入微信才进行监听
2 if (Constant.flag == 0) {
3 return;
4 }
查询到结果后修改flag值:
1 // 如果监听到了ListView的内容改变,则找到查询到的人,并点击进入
2 List<AccessibilityNodeInfo> textNodeList = event.getSource().findAccessibilityNodeInfosByText("微信号: " + Constant.wechatId);
3 if (textNodeList.size() > 0) {
4 textNodeList.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
5
6 // 模拟点击之后将暂存值置空,类似于取消监听
7 Constant.flag = 0;
8 Constant.wechatId = null;
9 }
3. 没查询到结果如何停止监听?
想必大家都发现了,上面的处理方法还没有考虑到未查询到好友的情况。那么,未查询到好友如何停止监听呢?
最开始想的是找到未查询页面,只要知道了什么情况是未查询的,那就可以停止监听了。
但是未查询到好友的页面查找比较麻烦,因此想了一个取巧的办法。
解决办法:
写一个线程,两秒后执行,因为用户一般在未查询到结果页面会停留至少两秒,两秒误操作就停止监听。
线程实现(线程得是类持有的,而不应该是方法持有的):
1 Handler handler = new Handler();
2 Runnable runnable = new Runnable() {
3 @Override
4 public void run() {
5 Constant.flag = 0;
6 Constant.wechatId = null;
7 }
8 };
监听方法内进行线程的开启操作:
1 // 两秒后如果还没有任何的事件,则停止监听
2 handler.removeCallbacks(runnable);
3 handler.postDelayed(runnable, 2000);
由于无障碍的监听方法会反复执行,因此为了保证其正确性,需要保证在最后一次事件才开始计时。
4. 如果在微信其他页面怎么办?
最开始被这个问题难住了。后来产品给了我一个思路,其实很简单,如果判断当前页面并不是微信主页面的话,就执行全局返回按钮事件就行。
解决办法:
如果是页面改变事件,并且当前页面不是主页面也不是搜索页面(搜索页面就可以直接搜索了)的话,就执行全局返回键。
1 if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !LAUNCHER_ACTIVITY_NAME.equals(event.getClassName().toString()) && !SEARCH_ACTIVITY_NAME.equals(event.getClassName().toString())) {
2 // 如果当前页面不是微信主页面也不是微信搜索页面,就模拟点击返回键
3 performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
4 return;
5 }
5. 页面改变UI加载太慢
在解决上述问题时,又遇到了之前遇到的问题,UI加载太慢的问题,因此需要在每次页面改变事件中都得加上300ms的延迟时间。
解决办法:
1 // 页面改变时需要延迟一段时间进行布局加载
2 if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
3 try {
4 Thread.sleep(300);
5 } catch (InterruptedException e) {
6 e.printStackTrace();
7 }
8 }
6. 聊天界面和主页面是同一个活动
解决了上述问题之后,又遇到了一个新的问题,经常性的返回到聊天页面就不返回了。
经过调试,发现聊天页面的活动和微信主页面的活动是同一个。
解决办法:
对聊天界面单独做处理,根据聊天界面左上角UI存在不存在来确定是否为聊天界面。
1 if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !LAUNCHER_ACTIVITY_NAME.equals(event.getClassName().toString()) && !SEARCH_ACTIVITY_NAME.equals(event.getClassNam