Search code examples
javaandroidkeypressawtrobotsocketserver

How to obtain typed character to java server through Android socket


I am creating a Remote PC app on android. I have written a code to obtain keyunicode of the pressed keys as shoen below

AndroiClient.java

public boolean dispatchKeyEvent(KeyEvent event) {
    if(event.getAction()==KeyEvent.ACTION_DOWN){
            int keyUniCode=event.getUnicodeChar(event.getMetaState());
            if(keyUniCode!=0){
                char charCode=(char) keyUniCode;
                Log.i("Code:",""+keyUniCode);
                SendMessage msg=new SendMessage(charCode);
                msg.execute();
            }
    }
    return super.dispatchKeyEvent(event);
}

And iti is received un java server using PrintWriter object.

JavaServer.java

public class KeyListener {

private Robot robot;
private static Socket client;
private static ServerSocket server;
private static InputStreamReader inputStreamReader;
private static BufferedReader bufferedReader;
private static String message;
private static KeyListener keyboard;
public static void main(String... args) throws Exception {
    keyboard = new KeyListener();
    server=new ServerSocket(6666);
    System.out.println("Waiting");
    while(true){
        client=server.accept();
        System.out.println("Accepted");
        inputStreamReader=new InputStreamReader(client.getInputStream());
        bufferedReader=new BufferedReader(inputStreamReader);
        message=bufferedReader.readLine();
        System.out.println(message);
        keyboard.type(message);
    }
}

public KeyListener() throws AWTException {
    this.robot = new Robot();
}

public KeyListener(Robot robot) {
    this.robot = robot;
}

public void type(CharSequence characters) {
    int length = characters.length();
    for (int i = 0; i < length; i++) {
        char character = characters.charAt(i);
        type(character);
    }
}

class MyException extends IllegalArgumentException{
    public MyException(String message) {
        super(message);
    }
}

public void type(char character) {
    switch (character) {
    case 'a': doType(VK_A); break;
    case 'b': doType(VK_B); break;
    case 'c': doType(VK_C); break;
    case 'd': doType(VK_D); break;
    case 'e': doType(VK_E); break;
    .
    .
    .
    .//other cases
    .
    .
    .
    case '\n': doType(VK_ENTER); break;
    .
    .
    .
    .//other cases
    .
    default:
        throw new MyException("Cannot type character " + character);
    }
}

private void doType(int... keyCodes) {
    doType(keyCodes, 0, keyCodes.length);
}

private void doType(int[] keyCodes, int offset, int length) {
    if (length == 0) {
        return;
    }

    robot.keyPress(keyCodes[offset]);
    doType(keyCodes, offset + 1, length - 1);
    robot.keyRelease(keyCodes[offset]);
}
}

Now the problem is am facing is the Enter and Backspace key doesnt generate any Unicode in android. So how can I obtain Enter and BacSpace key presses to java


Solution

  • Something along these lines should help

    public boolean dispatchKeyEvent(KeyEvent event) {
        if(event.getAction()==KeyEvent.ACTION_DOWN){
            if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                SendMessage msg = new SendMessage(some identifier for enter);
            } else if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
                SendMessage msg = new SendMessage(some identifier for delete);
            } else {
    
                int keyUniCode=event.getUnicodeChar(event.getMetaState());
                if(keyUniCode!=0){
                    char charCode=(char) keyUniCode;
                    Log.i("Code:",""+keyUniCode);
                    SendMessage msg=new SendMessage(charCode);
                    msg.execute();
                }
            }
        }
        return super.dispatchKeyEvent(event);
    }