前言:最近在弄一個模拟使用者點選螢幕的功能,并且不需要使用者點選螢幕,背景自動給輸入框指派,類似pc端按鍵精靈的功能,在網上找了很多人的資料,寫的都不是太詳細,一知半解.還要自己慢慢研究.于是我這邊寫一篇部落格整理出來,并且附上demo下載下傳.
這兩個指令的源碼在system/core/toolbox/下,sendevent.c getevent.c 使用這兩個指令的前提是手機擷取了root權限.
getevent可以擷取使用者的點選事件.
1).在cmd視窗中輸入指令:adb shell getevent (輸入adb指令的時候一定要配置android sdk環境變量)
2).點選我們app的确定按鈕.就會擷取裝置彙報的事件.
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).把這些指令複制到粘貼闆,我們輸入這些指令,效果圖如下:
這裡講解了sendevent跟getevent的使用,如果我們要給輸入框輸入值,隻需要一條指令就行. adb shell input text 'ansen'
還有一些其他指令,參考部落格:http://blog.sina.com.cn/s/blog_76550fd70101j2zs.html
接下來看代碼如何實作這個功能.我們在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();
}
運作效果圖如下:
<a target="_blank" href="http://download.csdn.net/detail/lowprofile_coding/9102995">點選下載下傳源碼</a>