该方法主要是面向输入相对比较困难的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 >	</span>commitResultText()


也有删除输入框里的文字的方法等等。我们可以定义一个这样的广播:


BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			if (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编程比较熟悉的话相信问题都不大~怎么更方便地和手机连接起来就不是本文的重点了嚯嚯。