如何远程调用Android应用的方法?

时间:2016-12-19 08:40:52

标签: android testing sip remote-access

我正在开发一个改进Android应用程序自动化测试的项目。我想做的事情非常“简单”:我有一个非常简单的SIP客户端,它具有基本的用户界面,只需阅读Android开发者网站(https://developer.android.com/guide/topics/connectivity/sip.html)上接收和拨打SIP电话的API指南。

我需要从我的电脑远程控制这个应用程序,连接在同一个本地网络或相同的wifi,通过发送命令或类似的(不与手机交互)到我的手机上正常运行的应用程序。示例我发布了调用 sipAddress 的方法initiateCall()(在应用程序中,sipAddress是从文本框中获取的),我想要做的是:

  • 在手机上启动应用
  • 从我的电脑调用方法initiateCall()给出一个sipAddress作为参数(我不能使用运行的应用程序中的UI,这就是我需要提供 sipAddress 的原因)
  • 检查是否从我手机上运行的应用开始拨打电话

我认为解决方案必须是关于网络服务的,但我没有更好的想法,我不知道如何开始以及从哪里开始解决这个问题,这就是我需要你帮助的原因。 / p>

public void initiateCall() {
    try {
        SipAudioCall.Listener listener = new SipAudioCall.Listener() {
         // set up the listener for outgoing calls
            @Override
            public void onCallEstablished(SipAudioCall call) {
                call.startAudio();
                call.setSpeakerMode(true);
                updateStatus(call, 2);
            }

            @Override
            public void onCallEnded(SipAudioCall call) {
                updateStatus("Call End");
            }
        };

        call = manager.makeAudioCall(me.getUriString(), sipAddress,
                listener, 30);

    } catch (Exception e) {
        Log.i("WalkieTalkieActivity/InitiateCall",
                "Error when trying to close manager.", e);
        if (me != null) {
            try {
                manager.close(me.getUriString());
            } catch (Exception ee) {
                Log.i("WalkieTalkieActivity/InitiateCall",
                        "Error when trying to close manager.", ee);
                ee.printStackTrace();
            }
        }
        if (call != null) {
            call.close();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你可以做REST API风格。您需要设置简约的网络服务器。

如果您访问了url phoneip/ctrl/makecall?number=yournumber我们调用的服务器端方法,如果设置正确的话。然后你可以调用方法并使用GET或POST变量作为参数。

您必须查看Java Webserver Libraries / Frameworks。你可以选择一个轻量级的。例如this one。 然后,您还可以非常轻松地添加安全功能(验证以保护它)。

sparkjava的例子

import static spark.Spark.*;

....

get("/ctrl/makecall", (request, response) -> {
      String phonenum =  request.queryParams("number"); //may not be accurate; you have to determine the GET variable called "number" in that case; you can rename it; see docs!!!
      //call your method with proper arguments
});