Android中实现远程输入

来源:互联网 发布:网络推广总监 编辑:程序博客网 时间:2024/06/06 13:19

该方法主要是面向输入相对比较困难的android电视机。实现的最后结果是,用手机中的输入法代替电视机输入。

简单描述一下流程:电视机获取输入框焦点,弹出输入法——打开手机的输入法,输入内容——内容发送到电视机的输入框。

那么要怎么实现呢?我们知道,一般而言是没办法获取到任意界面下的输入框的,所以只能从输入法下手。而为了让手机能将输入内容发送至电视,就得和电视机之间建立连接,我这里选用的是socket。

那么这里我们的目的就很明确了,就是一个能和手机端建立socket连接的电视机端输入法。

非常巧合的是,所有输入法其实都包含一个关键的服务,该服务继承自InputMethodService.java。什么时候这个服务会启动呢?当你选择该输入法作为默认输入法的时候,以及该输入法作为默认输入法的设备开机完成的时候。也就是说,我们可以在该服务中实现电视机和手机端的socket连接。并且开启子线程接收来自手机端的讯息。

我们再理顺一下思路。要实现socket连接,服务端需要做的事情就是启动一个服务,该服务启动一个子线程,这个子线程负责等待socket的连接。

       while (true) {        Socket s = null;try {     s = server.accept();} catch (Exception e) {e.printStackTrace();}}
那么该服务什么时候启动呢?在InputMethodService运行的时候开启该服务即可。

建立了socket连接之后,当电视机端收到指定的消息,就可以将该消息广播至InputMethodService,在该服务里有将文字添加到输入框里的方法

<span style="white-space:pre"></span>commitResultText()
也有删除输入框里的文字的方法等等。我们可以定义一个这样的广播:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubif (Constant.REMOTE_INPUT.equals(intent.getAction())) {//输入内容commitResultText(intent.getStringExtra(Constant.REMOTE_INPUT));resetToIdleState(false);}else if (Constant.REMOTE_INPUT_DELETE.equals(intent.getAction())) {//删除一个字符 InputConnection ic = getCurrentInputConnection();        if (null != ic)        ic.deleteSurroundingText(1, 0);}else if (Constant.REMOTE_INPUT_DELETE_ALL.equals(intent.getAction())) {//全部删除(实际上只是删除100个字符) InputConnection ic = getCurrentInputConnection();        if (null != ic)        ic.deleteSurroundingText(100, 0);}}};
这样就大功告成了~很多细节没有提及,但是对socket编程比较熟悉的话相信问题都不大~怎么更方便地和手机连接起来就不是本文的重点了嚯嚯。

0 0