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
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);
}