androidandroid-uiautomatoruidevice

UiAutomator: How to achieve a paste action using uiautomator?


I need to have non-ASCII character (like chinese character) inputted in EditText, I found the UiObject.setText() method can not do this work.

So I get a method: copy the character to the clipboard, then paste it to the EditText. Now I have achieved the copy work, but don't know how to achieve the paste action using code.

I searched on the web, and find paste action can be achieved using hotkeys: "menu" + "v"

so I go to the UiDevice api, and find a method: pressKeycode(), but it can only press one key code a time.

Does anyone knows how to press "menu" and "v" at same time using uiautomator or there is some original code to achieve this?

Thanks very much!


Solution

  • I have resolved this issue. see code below:

    public class MyTest  extends TestCase{
    
        /**
        * Paste text to an EditText feild which is currentlly get focused.
        *
        * @param: text the text(Non-ASCII) you want to paste into EditText feild. 
        */
        IClipboard clipboard = IClipboard.Stub.asInterface(ServiceManager.getService(Context.CLIPBOARD_SERVICE));
        IInputManager iInputManager = IInputManager.Stub.asInterface(ServiceManager.getService(Context.INPUT_SERVICE)); 
        private void pastText(String text) throws UiObjectNotFoundException{
            try {
                //copy the text to clipboard.
                clipboard.setPrimaryClip(ClipData.newPlainText("NonASCII", text), text);   
    
                //inject event: press Menu + V         
                iInputManager.injectInputEvent(
                    new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                                 android.os.SystemClock.uptimeMillis(), 
                                 KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU, 0),1); 
                iInputManager.injectInputEvent(
                    new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                                 android.os.SystemClock.uptimeMillis(), 
                                 KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_V, 0),1);              
                iInputManager.injectInputEvent(
                    new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                                 android.os.SystemClock.uptimeMillis(), 
                                 KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU, 0),1);
                iInputManager.injectInputEvent(
                    new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                                 android.os.SystemClock.uptimeMillis(), 
                                 KeyEvent.ACTION_UP, KeyEvent.KEYCODE_V, 0),1);              
    
                //After "Menu"+"V" pressed, A "Menu" will show if exist in current Activicy.
                //Then press menu again, to make it down just for bug fixing.
                sleep(300);
                iInputManager.injectInputEvent(
                    new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                                 android.os.SystemClock.uptimeMillis(), 
                                 KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU, 0),1); 
                iInputManager.injectInputEvent(
                    new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                                 android.os.SystemClock.uptimeMillis(), 
                                 KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU, 0),1);
    
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    Thanks.