天天看點

Android sendevent/getevent 用法

前言:最近在弄一個模拟使用者點選螢幕的功能,并且不需要使用者點選螢幕,背景自動給輸入框指派,類似pc端按鍵精靈的功能,在網上找了很多人的資料,寫的都不是太詳細,一知半解.還要自己慢慢研究.于是我這邊寫一篇部落格整理出來,并且附上demo下載下傳.

這兩個指令的源碼在system/core/toolbox/下,sendevent.c getevent.c    使用這兩個指令的前提是手機擷取了root權限. 

getevent可以擷取使用者的點選事件.

1).在cmd視窗中輸入指令:adb shell getevent    (輸入adb指令的時候一定要配置android sdk環境變量)

2).點選我們app的确定按鈕.就會擷取裝置彙報的事件.

Android sendevent/getevent 用法

3).我們可以看到點選一個按鈕産生了12行資訊,代表12個事件.  我來解釋第一行資訊: [裝置名稱] [類型] [code] [value]

     有哪些類型請參考部落格:http://blog.csdn.net/kickxxx/article/details/7482392

/dev/input/event7: 0001 014a 00000001  

/dev/input/event7: 0003 003a 00000001  

/dev/input/event7: 0003 0035 00000172  

/dev/input/event7: 0003 0036 00000129  

/dev/input/event7: 0000 0002 00000000  

/dev/input/event7: 0000 0000 00000000  

/dev/input/event7: 0001 014a 00000000  

/dev/input/event7: 0003 003a 00000000  

sendevent事件的使用

1).我們用getevent擷取的值是16進制的,而sendevent輸入的值是10進制的,我這裡把這些值轉換了,并且增加了字首"adb shell sendevent".

adb shell sendevent /dev/input/event7 0001 330 00000001  

adb shell sendevent /dev/input/event7 0003 58  00000001  

adb shell sendevent /dev/input/event7 0003 0053 00000370  

adb shell sendevent /dev/input/event7 0003 0054 00000297  

adb shell sendevent /dev/input/event7 0000 0002 00000000  

adb shell sendevent /dev/input/event7 0000 0000 00000000  

adb shell sendevent /dev/input/event7 0001 0330 00000000  

adb shell sendevent /dev/input/event7 0003 0058 00000000  

2).我們看到上面最後面一欄中有370跟297兩個數,這是是點選的坐标在螢幕的位置.如果我們用點選事件,隻需要改變這兩個值就可.

3).把這些指令複制到粘貼闆,我們輸入這些指令,效果圖如下:

Android sendevent/getevent 用法

這裡講解了sendevent跟getevent的使用,如果我們要給輸入框輸入值,隻需要一條指令就行.   adb shell input text 'ansen'

還有一些其他指令,參考部落格:http://blog.sina.com.cn/s/blog_76550fd70101j2zs.html

Android sendevent/getevent 用法

接下來看代碼如何實作這個功能.我們在android程式中可以執行shell指令.再次提醒需要root權限.我這邊是軟體啟動延時三秒,執行點選事件點選輸入框,然後給edittext指派.

public class mainactivity extends activity {  

    public final static string clieck_input="" +  

              "sendevent /dev/input/event7 0001 330 00000001 \n " +  

              "sendevent /dev/input/event7 0003 58 00000001 \n" +  

              "sendevent /dev/input/event7 0003 53 00000159 \n" +  

              "sendevent /dev/input/event7 0003 54 00000186 \n" +  

              "sendevent /dev/input/event7 0000 0002 00000000 \n" +  

              "sendevent /dev/input/event7 0000 0000 00000000 \n" +  

              "sendevent /dev/input/event7 0001 330 00000000 \n" +  

              "sendevent /dev/input/event7 0003 58 00000000 \n" +  

              "sendevent /dev/input/event7 0000 0000 00000000 \n sleep 2 m \n" +  

              " ";  

    private handler handler=new handler(){  

        public void handlemessage(android.os.message msg) {  

        };  

    };  

    @override  

    protected void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        setcontentview(r.layout.activity_main);  

        findviewbyid(r.id.confirm).setonclicklistener(clicklistener);  

        handler.postdelayed(new runnable() {  

            @override  

            public void run() {  

                execshell(clieck_input);  

                execshell("input text  'ansen'");  

            }  

        }, 3000);  

    }  

    private onclicklistener clicklistener=new onclicklistener() {  

        @override  

        public void onclick(view v) {  

            toast.maketext(mainactivity.this, "點選了确定按鈕", 0).show();  

        }  

    public void execshell(string cmd) {  

        try {  

            toast.maketext(mainactivity.this,"執行shell指令", 0).show();  

            // 權限設定  

            process p = runtime.getruntime().exec("su");  

            // 擷取輸出流  

            outputstream outputstream = p.getoutputstream();  

            dataoutputstream dataoutputstream = new dataoutputstream(outputstream);  

            // 将指令寫入  

            dataoutputstream.writebytes(cmd);  

            // 送出指令  

            dataoutputstream.flush();  

            // 關閉流操作  

            dataoutputstream.close();  

            outputstream.close();  

        } catch (throwable t) {  

            t.printstacktrace();  

}  

運作效果圖如下:

Android sendevent/getevent 用法

<a target="_blank" href="http://download.csdn.net/detail/lowprofile_coding/9102995">點選下載下傳源碼</a>

繼續閱讀