DroidVNC-NG支持控制端输入内容,但是仅支持英文字符,如果需要控制输入法软键盘输入中文的话就没办法了,经过摸索找到了解决办法。
这个解决办法有个条件就是让DroidVNC-NG成为系统级应用(这个条件比较苛刻),所幸现在用的安卓系统有源代码并且是自己编译的,可以拿到系统签名文件。
方法简述:
一、Manifest.xml文件中添加两条:
1.application中添加:
android:sharedUserId="android.uid.system"
2.添加权限:
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
二、InputService.java中打补丁
1.添加模拟按键函数:
/*
函数功能:模拟输入
输入参数:
KeyCode:要模拟的键值
shiftOn:是否按下shift键
*/
public static void typeIn( final int KeyCode ,final int shiftOn){
try {
Instrumentation inst = new Instrumentation();
if(shiftOn==0) {
inst.sendKeyDownUpSync(KeyCode);
}
else{
long downTime= SystemClock.uptimeMillis();
long eventTime= downTime;
inst.sendKeySync(new KeyEvent(downTime,eventTime,KeyEvent.ACTION_DOWN,KeyCode ,0, KeyEvent.META_SHIFT_ON));
inst.sendKeySync(new KeyEvent(downTime,eventTime,KeyEvent.ACTION_UP, KeyCode,0, KeyEvent.META_SHIFT_ON));
}
Log.d(TAG, "simulate key in: key " + KeyCode);
} catch (Exception e) {
Log.e("Exception when sendKeySync", e.toString());
}
}
2.在现有的onKeyEvent函数中添加判断代码:
public static void onKeyEvent(int down, long keysym, long client) {
//以上是原有代码...
if(keysym == 0xff08 && down != 0){ //后退,替换原有的后退键处理代码
int keycode = 67;
typeIn(keycode,0);
}
/*
ISO-8859-1 input
*/
if (keysym >= 32 && keysym <= 255 && down != 0) {
//以下处理自己需要的按键操作:空格、字符a-z、数字0-9等
int keycode = Integer.parseInt(String.valueOf(keysym));
boolean bSimKey=false;
if(keycode==32){//空格
keycode=62;
bSimKey=true;
}
else if(keycode>=97 && keycode<=122) { //a-z
keycode = keycode - 68;
bSimKey=true;
}
else if (keycode>=48 && keycode<=57){ //0-9
keycode = keycode - 41;
bSimKey=true;
}
if(bSimKey) {
typeIn(keycode,0);
}
else {
//以下是原有代码
//...
}
三、用系统签名文件生成签名的apk文件,安装、配置后即可正常使用受控端的中英文输入了,和在本地使用没什么区别。