uiautomator实现接电话的case

1.UiWatcher


该接口中只有一个方法


public abstract boolean checkForCondition ()

当我们通过UiSelector匹配控件的时候,如果失败后,会进入该方法进行验证。意思只要我们的控件找不到,都会进入该方法中,那么我们就可以在该方法中判断是否有电话打进来。首先我们去查看有电话打进来的界面,找到一个可以确定是接听界面就行。我们以拒绝接听按钮为标识(不缺钱的可以用接听电话为标识)。


case的写法


public class InCallTest extends UiAutomatorTestCase {
    private static final long TIME_OUT = 10 * 60 * 1000;
    private long currentTime;
    private boolean flag = true;

    long eslcape = 0;

    public void test_Call() throws InterruptedException,
            UiObjectNotFoundException {
        UiWatcher inComingWatcher = new MyWatcher();
        getUiDevice().registerWatcher("来电", inComingWatcher);
       
        getUiDevice().pressBack();
        UiObject dialButton = new UiObject(
                new UiSelector()
                        .resourceId("com.android.sprdlauncher1:id/workspace"));
        System.out.println("waiting for incoming");
        currentTime = System.currentTimeMillis();
        while (flag && eslcape < TIME_OUT) {
            dialButton.clickAndWaitForNewWindow();
            eslcape = System.currentTimeMillis() - currentTime;
        }
        assertFalse("没有收到来电", flag);
    }

    class MyWatcher implements UiWatcher {

        @Override
        public boolean checkForCondition() {
            UiObject inCall = new UiObject(
                    new UiSelector()
                            .resourceId("com.android.dialer:id/IncomingCallRejectButton"));
           
            while (eslcape < TIME_OUT) {
                if (inCall.exists()) {
                    System.out.println("you have a call");
                    try {
                        inCall.clickAndWaitForNewWindow();
                        flag = false;
                        return true;
                    } catch (UiObjectNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                eslcape = System.currentTimeMillis() - currentTime;
            }
            return false;
        }
    }
}



case解释


首先要了解进入uiwatcher方法中的机制,是在你某个控件找不到的情况下会进入。但是你得保证进入以后处理完来电界面以后,这条case得保证正确,那么说明回来以后这个控件要能找到。刚开始的时候,我认为来电后,点击接听,会出现通话画面,这个时候我们来判断该界面上的某一个控件是否存在,这样我们就能保证这条case执行完毕了。但是实验后,是不可以的。uiautomator只会在开始的界面上寻找,像通话界面它只会认为它是个弹出框。所以它会认为case执行失败。

所以后来我想到的解决方案是首先在主页面上找一个控件,点击后是没反应的,这样我就循环去点击。设定一个超时时间和一个标志位flag,让case一直等待着。当来电界面触发后,会进入uiwatcher后,处理完来电界面后,将标志flag设置为false。这样回来后这个控件仍然存在,但是这个时候flag已经为false。所以就不会再循环点击主界面上的控件了。case也会被认为是执行成功了,当不再进入循环后,我们判断一下flag的值。如果为true。说明没有被改变,那么也就没有接收到来电的界面。这个时候也应该判断为case失败。




执行case后的输出


 [exec] INSTRUMENTATION_STATUS: numtests=1
     [exec] INSTRUMENTATION_STATUS: stream=
     [exec] com.sprd.test.uiautomator.call.InCallTest:
     [exec] INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
     [exec] INSTRUMENTATION_STATUS: test=test_Call
     [exec] INSTRUMENTATION_STATUS: class=com.sprd.test.uiautomator.call.InCallTest
     [exec] INSTRUMENTATION_STATUS: current=1
     [exec] INSTRUMENTATION_STATUS_CODE: 1
     [exec] waiting for incoming
     [exec] you have a call
     [exec] INSTRUMENTATION_STATUS: numtests=1
     [exec] INSTRUMENTATION_STATUS: stream=.
     [exec] INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
     [exec] INSTRUMENTATION_STATUS: test=test_Call
     [exec] INSTRUMENTATION_STATUS: class=com.sprd.test.uiautomator.call.InCallTest
     [exec] INSTRUMENTATION_STATUS: current=1
     [exec] INSTRUMENTATION_STATUS_CODE: 0
     [exec] INSTRUMENTATION_STATUS: stream=
     [exec] Test results for WatcherResultPrinter=.
     [exec] Time: 17.053
     [exec] OK (1 test)
     [exec] INSTRUMENTATION_STATUS_CODE: -1
BUILD SUCCESSFUL


后续的扩展


既然能监听到来电,那么下一步要实现控制2台机器实现A给B打电话的功能。这个要用到框架啦。




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值