autojs的使用文档
Autojs腳本開發(fā)課程
Autojs概述
1、Autojs是什么,能做什么?
-
**不需要Root權(quán)限 ** 的 JavaScript 自動(dòng)化 軟件
-
基于無障礙服務(wù)接口
-
官網(wǎng):https://hyb1996.github.io/AutoJs-Docs/#/
-
開發(fā)APP腳本
-
自動(dòng)化操作、引流腳本、游戲腳本、簡(jiǎn)單app
2、Autojs各版本之間的區(qū)別
-
4.1.1版本
-
7.0.0 pro版本
-
8.0.0 pro版本
3、Autojs的學(xué)習(xí)路徑和學(xué)習(xí)方法
-
基礎(chǔ)入門JavaScript
-
ES6語法
-
Autojs文檔
-
Autojs示例
-
Autojs實(shí)戰(zhàn)
-
專業(yè)程序員的培訓(xùn)方式
-
Autojs英語單詞入門
-
Autojs代碼書寫規(guī)范
-
Autojs錯(cuò)誤調(diào)試和分析
-
每天直播答疑解惑
Autojs腳本開發(fā)環(huán)境搭建
1、autojs軟件安裝及簡(jiǎn)單使用
-
4.1.1版本的安裝
-
8.0 pro 版本的安裝
-
簡(jiǎn)單熟悉一下autojs軟件
2、安卓手機(jī)投屏軟件的安裝和使用
3、雷電模擬器的安裝和使用
4、VScode編輯器的安裝和使用
5、autojs插件安裝和使用
-
hyb1996
-
ctrl+shift+p
6、autojs手機(jī)端(模擬器端)和電腦端相互連接
-
手機(jī)和電腦務(wù)必在同一個(gè)局域網(wǎng)下
-
4.1.1版本的電腦端需要開啟autojs服務(wù)
-
ipconfig查看本機(jī)IP地址
-
安卓版本需要在7.0以上
7、編寫第一個(gè)autojs腳本并打包成apk
-
保存js文件到手機(jī)
應(yīng)用 — APP
1、關(guān)于APP版本的命令
app.versionCode
-
當(dāng)前軟件版本號(hào)
app.versionName
-
當(dāng)前軟件版本名稱
app.autojs.versionCode
-
autojs版本號(hào)
app.autojs.versionName
-
autojs版本名稱
2、打開APP
app.launchApp(appName)
-
通過APP名稱打開APP
app.launch(packageName)
-
通過APP包名打開APP
app.getPackageName(appName)
-
獲取應(yīng)用名稱對(duì)應(yīng)的已安裝的應(yīng)用的包名。
-
如果該找不到該應(yīng)用,返回null;如果該名稱對(duì)應(yīng)多個(gè)應(yīng)用,則只返回其中某一個(gè)的包名。
app.getAppName(packageName)
-
獲取應(yīng)用包名對(duì)應(yīng)的已安裝的應(yīng)用的名稱。如果該找不到該應(yīng)用,返回null。
3、查看和編輯文件
app.viewFile(path)
-
用其他應(yīng)用查看文件。文件不存在的情況由查看文件的應(yīng)用處理。
app.editFile(path)
-
用其他應(yīng)用編輯文件。文件不存在的情況由編輯文件的應(yīng)用處理。
4、APP的安裝和卸載
app.uninstall(packageName)
-
卸載應(yīng)用。執(zhí)行后會(huì)會(huì)彈出卸載應(yīng)用的提示框。如果該包名的應(yīng)用未安裝,由應(yīng)用卸載程序處理,可能彈出"未找到應(yīng)用"的提示。
app.viewFile(path)
-
path:apk的地址
5、不同的跳轉(zhuǎn)方式
app.openAppSetting(packageName)
-
打開應(yīng)用的詳情頁(yè)(設(shè)置頁(yè))。如果找不到該應(yīng)用,返回false; 否則返回true。
-
該函數(shù)也可以作為全局函數(shù)使用。
app.startActivity(name)
-
啟動(dòng)Auto.js的特定界面。該函數(shù)在Auto.js內(nèi)運(yùn)行則會(huì)打開Auto.js內(nèi)的界面,在打包應(yīng)用中運(yùn)行則會(huì)打開打包應(yīng)用的相應(yīng)界面。
-
name {string} 活動(dòng)名稱,可選的值為:
- console 日志界面
- settings 設(shè)置界面
app.openUrl(url)
-
用瀏覽器打開網(wǎng)站url。
6、自動(dòng)發(fā)送郵件
app.sendEmail(options)
-
options
{Object} 發(fā)送郵件的參數(shù)。包括:
- email {string} | {Array} 收件人的郵件地址。如果有多個(gè)收件人,則用字符串?dāng)?shù)組表示
- cc {string} | {Array} 抄送收件人的郵件地址。如果有多個(gè)抄送收件人,則用字符串?dāng)?shù)組表示
- bcc {string} | {Array} 密送收件人的郵件地址。如果有多個(gè)密送收件人,則用字符串?dāng)?shù)組表示
- subject {string} 郵件主題(標(biāo)題)
- text {string} 郵件正文
- attachment {string} 附件的路徑。
-
根據(jù)選項(xiàng)options調(diào)用郵箱應(yīng)用發(fā)送郵件。這些選項(xiàng)均是可選的。
一般全局函數(shù) - Globals
懸浮窗 - Floaty
懸浮窗在腳本停止運(yùn)行時(shí)會(huì)自動(dòng)關(guān)閉,因此,要保持懸浮窗不被關(guān)閉,可以用一個(gè)空的setInterval來實(shí)現(xiàn),例如:setInterval(()=>{}, 1000);1、創(chuàng)建和關(guān)閉懸浮窗
floaty.window(layout)
-
創(chuàng)建并顯示一個(gè)懸浮窗
-
返回一個(gè)FloatyWindow對(duì)象。
var w = floaty.window(<frame gravity="center"><text id="text">懸浮文字</text></frame> );setTimeout(()=>{w.close(); }, 2000); -
因?yàn)槟_本運(yùn)行的線程不是UI線程,而所有對(duì)控件的修改操作需要在UI線程執(zhí)行,此時(shí)需要用ui.run
ui.run(function(){w.text.setText("文本"); });
floaty.rawWindow(layout)
-
創(chuàng)建并顯示一個(gè)原始懸浮窗,返回一個(gè)FloatyRawWindow對(duì)象
-
與floaty.window()函數(shù)不同的是,該懸浮窗不會(huì)增加任何額外設(shè)施(例如調(diào)整大小、位置按鈕),您可以根據(jù)自己需要編寫任何布局。
-
而且,該懸浮窗支持完全全屏,可以覆蓋狀態(tài)欄,因此可以做護(hù)眼模式之類的應(yīng)用
var w = floaty.rawWindow(<frame gravity="center"><text id="text">懸浮文字</text></frame> );w.setPosition(500, 500);setTimeout(()=>{w.close(); }, 2000);
floaty.closeAll()
- 關(guān)閉所有懸浮窗
2、FloatyWindow對(duì)象
懸浮窗對(duì)象,可通過FloatyWindow.{id}獲取懸浮窗界面上的元素。例如, 懸浮窗window上一個(gè)控件的id為aaa, 那么window.aaa即可獲取到該控件,類似于ui。FloatyWindow.setAdjustEnabled(enabled)
-
是否啟用懸浮窗調(diào)整(大小、位置)
-
ture啟用 false不啟用
FloatyWindow.setPosition(x, y)
-
設(shè)置懸浮窗位置
FloatyWindow.getX()
-
返回懸浮窗位置的X坐標(biāo)。
FloatyWindow.getY()
-
返回懸浮窗位置的Y坐標(biāo)。
FloatyWindow.setSize(width, height)
-
設(shè)置懸浮窗寬高。
FloatyWindow.getWidth()
-
返回懸浮窗寬度。
FloatyWindow.getHeight()
-
返回懸浮窗高度。
FloatyWindow.close()
-
關(guān)閉懸浮窗。如果懸浮窗已經(jīng)是關(guān)閉狀態(tài),則此函數(shù)將不執(zhí)行任何操作。
被關(guān)閉后的懸浮窗不能再顯示。
FloatyWindow.exitOnClose()
-
使懸浮窗被關(guān)閉時(shí)自動(dòng)結(jié)束腳本運(yùn)行
3、FloatyRawWindow對(duì)象
原始懸浮窗對(duì)象,可通過window.{id}獲取懸浮窗界面上的元素。例如, 懸浮窗window上一個(gè)控件的id為aaa, 那么window.aaa即可獲取到該控件,類似于ui。FloatyRawWindow.setTouchable(touchable)
-
touchable {Boolean} 是否可觸摸
-
true可觸摸懸浮窗 false 不可觸摸懸浮窗
var w = floaty.rawWindow(<frame gravity="center" bg="#44ffcc00"/> );w.setSize(-1, -1); w.setTouchable(false);setTimeout(()=>{w.close(); }, 4000);
FloatyRawWindow.setPosition(x, y)
-
設(shè)置懸浮窗位置
FloatyRawWindow.getX()
-
返回懸浮窗位置的X坐標(biāo)。
FloatyRawWindow.getY()
-
返回懸浮窗位置的Y坐標(biāo)。
FloatyRawWindow.setSize(width, height)
-
設(shè)置懸浮窗寬高。
-
如果設(shè)置為-1,則為占滿全屏;
FloatyRawWindow.getWidth()
-
返回懸浮窗寬度。
FloatyRawWindow.getHeight()
-
返回懸浮窗高度。
FloatyRawWindow.close()
-
關(guān)閉懸浮窗。如果懸浮窗已經(jīng)是關(guān)閉狀態(tài),則此函數(shù)將不執(zhí)行任何操作。
被關(guān)閉后的懸浮窗不能再顯示。
FloatyRawWindow.exitOnClose()
-
使懸浮窗被關(guān)閉時(shí)自動(dòng)結(jié)束腳本運(yùn)行
腳本引擎 - Engines
engines模塊包含了一些與腳本環(huán)境、腳本運(yùn)行、腳本引擎有關(guān)的函數(shù),包括運(yùn)行其他腳本,關(guān)閉腳本等。
例如,獲取腳本所在目錄:
toast(engines.myEngine().cwd());1、在腳本引擎中運(yùn)行腳本
engines.execScript(name, script[, config])
- name {string} 要運(yùn)行的腳本名稱。這個(gè)名稱和文件名稱無關(guān),只是在任務(wù)管理中顯示的名稱。
- script {string} 要運(yùn)行的腳本內(nèi)容。
- config{Object} 運(yùn)行配置項(xiàng)
- delay {number} 延遲執(zhí)行的毫秒數(shù),默認(rèn)為0
- loopTimes {number} 循環(huán)運(yùn)行次數(shù),默認(rèn)為1。0為無限循環(huán)。
- interval {number} 循環(huán)運(yùn)行時(shí)兩次運(yùn)行之間的時(shí)間間隔,默認(rèn)為0
- path {Array} | {string} 指定腳本運(yùn)行的目錄。這些路徑會(huì)用于require時(shí)尋找模塊文件。
在新腳本環(huán)境中運(yùn)行腳本script。返回一個(gè)ScriptExectuion對(duì)象。
所謂新的腳本環(huán)境,指定是,腳本中的變量和原腳本的變量是不共享的,并且,腳本會(huì)在新的線程中運(yùn)行。
最簡(jiǎn)單的例子如下:
engines.execScript("hello world", "toast('hello world')");如果要循環(huán)運(yùn)行,則:
//每隔3秒運(yùn)行一次腳本,循環(huán)10次 engines.execScript("hello world", "toast('hello world')", {loopTimes: 10,interval: 3000 });用字符串來編寫腳本非常不方便,可以結(jié)合 Function.toString()的方法來執(zhí)行特定函數(shù):
function helloWorld(){//注意,這里的變量和腳本主體的變量并不共享toast("hello world"); } engines.execScript("hello world", "helloWorld();\n" + helloWorld.toString());如果要傳遞變量,則可以把這些封裝成一個(gè)函數(shù):
//在新的腳本環(huán)境中執(zhí)行 1 + 2 exec(add, {a: 1, b:2});function exec(action, args){args = args || {};var tmp = action.toString();var re = /function\s*(\w*)/i;var matches = re.exec(tmp);//方法名var name=matches[1];engines.execScript(name, name + "(" + JSON.stringify(args) + ");\n" + action.toString()); }// var tmp = ddd.toString(); // var re = /function\s*(\w*)/i; // var matches = re.exec(tmp);//方法名 // var name=matches[1]; // log(name)//要執(zhí)行的函數(shù),是一個(gè)簡(jiǎn)單的加法 function ddd(args){toast(args.a + args.b); }2、在腳本引擎中運(yùn)行js文件
engines.execScriptFile(path[, config])
- path {string} 要運(yùn)行的腳本路徑。
- config{Object} 運(yùn)行配置項(xiàng)
- delay {number} 延遲執(zhí)行的毫秒數(shù),默認(rèn)為0
- loopTimes {number} 循環(huán)運(yùn)行次數(shù),默認(rèn)為1。0為無限循環(huán)。
- interval {number} 循環(huán)運(yùn)行時(shí)兩次運(yùn)行之間的時(shí)間間隔,默認(rèn)為0
- path {Array} | {string} 指定腳本運(yùn)行的目錄。這些路徑會(huì)用于require時(shí)尋找模塊文件。
在新的腳本環(huán)境中運(yùn)行腳本文件path。返回一個(gè)ScriptExecution對(duì)象。
engines.execScriptFile("/sdcard/腳本/1.js");3、在腳本引擎中運(yùn)行錄制的腳本文件
engines.execAutoFile(path[, config])
- path {string} 要運(yùn)行的錄制文件路徑。
- config{Object} 運(yùn)行配置項(xiàng)
- delay {number} 延遲執(zhí)行的毫秒數(shù),默認(rèn)為0
- loopTimes {number} 循環(huán)運(yùn)行次數(shù),默認(rèn)為1。0為無限循環(huán)。
- interval {number} 循環(huán)運(yùn)行時(shí)兩次運(yùn)行之間的時(shí)間間隔,默認(rèn)為0
- path {Array} | {string} 指定腳本運(yùn)行的目錄。這些路徑會(huì)用于require時(shí)尋找模塊文件。
在新的腳本環(huán)境中運(yùn)行錄制文件path。返回一個(gè)ScriptExecution對(duì)象。
engines.execAutoFile("/sdcard/腳本/1.auto");4、腳本引擎控制方法
engines.stopAll()
-
停止所有正在運(yùn)行的腳本。包括當(dāng)前腳本自身
engines.stopAllAndToast()
-
停止所有正在運(yùn)行的腳本并顯示停止的腳本數(shù)量。包括當(dāng)前腳本自身。
engines.myEngine()
-
返回當(dāng)前腳本的腳本引擎對(duì)象(ScriptEngine)
ScriptExecution 執(zhí)行對(duì)象
ScriptEngine 引擎對(duì)象
engines.all()
-
返回當(dāng)前所有正在運(yùn)行的腳本的腳本引擎對(duì)象ScriptEngine的數(shù)組。
5、腳本執(zhí)行對(duì)象–ScriptExecution
執(zhí)行腳本時(shí)返回的對(duì)象,可以通過他獲取執(zhí)行的引擎、配置等,也可以停止這個(gè)執(zhí)行。
要停止這個(gè)腳本的執(zhí)行,使用ScriptExecution.getEngine().forceStop()
ScriptExecution.getEngine()
-
返回執(zhí)行該腳本的腳本引擎對(duì)象(ScriptEngine)
ScriptExecution.getConfig()
-
返回該腳本的運(yùn)行配置(ScriptConfig)
6、腳本引擎對(duì)象–ScriptEngine
ScriptEngine.forceStop()
-
停止腳本引擎的執(zhí)行
ScriptEngine.cwd()
-
返回腳本執(zhí)行的路徑。對(duì)于一個(gè)腳本文件而言為這個(gè)腳本所在的文件夾;
-
對(duì)于其他腳本,例如字符串腳本,則為null或者執(zhí)行時(shí)的設(shè)置值。
ScriptEngine.getSource()
-
返回當(dāng)前腳本引擎正在執(zhí)行的腳本對(duì)象。
-
返回腳本路徑
7、腳本引擎之間的通信
ScriptEngine.emit(eventName[, …args])
- eventName {string} 事件名稱
- ...args {any} 事件參數(shù)
向該腳本引擎發(fā)送一個(gè)事件,該事件可以在該腳本引擎對(duì)應(yīng)的腳本的events模塊監(jiān)聽到并在腳本主線程執(zhí)行事件處理。
例如腳本receiver.js的內(nèi)容如下://監(jiān)聽say事件 events.on("say", function(words){toastLog(words); });//保持腳本運(yùn)行 setInterval(()=>{}, 1000); //運(yùn)行腳本 var e = engines.execScriptFile("./receiver.js");//等待腳本啟動(dòng) sleep(2000);//向該腳本發(fā)送事件 e.getEngine().emit("say", "你好");8、腳本引擎配置–ScriptConfig
delay
-
延遲執(zhí)行的毫秒數(shù)
interval
-
循環(huán)運(yùn)行時(shí)兩次運(yùn)行之間的時(shí)間間隔
loopTimes
-
循環(huán)運(yùn)行次數(shù)
getPath()
-
返回一個(gè)字符串?dāng)?shù)組表示腳本運(yùn)行時(shí)模塊尋找的路徑
一般全局函數(shù) - Globals
1、常用的全局函數(shù)
sleep(n)
-
暫停運(yùn)行n毫秒的時(shí)間。1秒等于1000毫秒。
toast(message)
-
以氣泡顯示信息message幾秒。(具體時(shí)間取決于安卓系統(tǒng),一般都是2秒)
log(message)
-
在控制臺(tái)調(diào)試輸出信息
toastLog(message)
-
在控制臺(tái)和氣泡中同時(shí)輸出信息
exit()
-
立即停止腳本運(yùn)行。
2、返回當(dāng)前監(jiān)測(cè)包名和Activity
currentPackage()
-
返回最近一次監(jiān)測(cè)到的正在運(yùn)行的應(yīng)用的包名,一般可以認(rèn)為就是當(dāng)前正在運(yùn)行的應(yīng)用的包名。
currentActivity()
-
返回最近一次監(jiān)測(cè)到的正在運(yùn)行的Activity的名稱,一般可以認(rèn)為就是當(dāng)前正在運(yùn)行的Activity的名稱。
3、等待包名和Activity的出現(xiàn)
waitForActivity(activity[, period = 200])
- activity Activity名稱
- period 輪詢等待間隔(毫秒)
等待指定的Activity出現(xiàn),period為檢查Activity的間隔。
waitForPackage(package[, period = 200])
- package 包名
- period 輪詢等待間隔(毫秒)
等待指定的應(yīng)用出現(xiàn)。例如waitForPackage("com.tencent.mm")為等待當(dāng)前界面為微信。
4、剪切板:實(shí)現(xiàn)復(fù)制粘貼功能
setClip(text)
-
設(shè)置剪貼板內(nèi)容。此剪貼板即系統(tǒng)剪貼板,在一般應(yīng)用的輸入框中"粘貼"既可使用。
getClip()
-
返回系統(tǒng)剪貼板的內(nèi)容。
paste()
-
粘貼
5、獲取隨機(jī)數(shù)
random()
-
返回在[0, 1)的隨機(jī)浮點(diǎn)數(shù)。
random(min, max)
-
返回一個(gè)在[min…max]之間的隨機(jī)數(shù)。例如random(0, 2)可能產(chǎn)生0, 1, 2。
6、適配安卓版本和Autojs版本
requiresApi(api)
-
表示此腳本需要Android API版本達(dá)到指定版本才能運(yùn)行。例如requiresApi(19)表示腳本需要在Android 4.4以及以上運(yùn)行。
-
調(diào)用該函數(shù)時(shí)會(huì)判斷運(yùn)行腳本的設(shè)備系統(tǒng)的版本號(hào),如果沒有達(dá)到要求則拋出異常。
平臺(tái)版本: API級(jí)別Android 7.0: 24Android 6.0: 23Android 5.1: 22Android 5.0: 21Android 4.4W: 20Android 4.4: 19Android 4.3: 18
requiresAutojsVersion(version)
-
version {string} | {number} Auto.js的版本或版本號(hào)
-
表示此腳本需要Auto.js版本達(dá)到指定版本才能運(yùn)行。例如requiresAutojsVersion("3.0.0 Beta")表示腳本需要在Auto.js 3.0.0 Beta以及以上運(yùn)行
-
調(diào)用該函數(shù)時(shí)會(huì)判斷運(yùn)行腳本的Auto.js的版本號(hào),如果沒有達(dá)到要求則拋出異常。
-
可以通過app.autojs.versionCode和app.autojs.versionName獲取當(dāng)前的Auto.js版本號(hào)和版本。
控制臺(tái) - Console
1、控制臺(tái)的常用命令
console.show()
- 顯示控制臺(tái)。這會(huì)顯示一個(gè)控制臺(tái)的懸浮窗(需要懸浮窗權(quán)限)。
console.hide()
- 隱藏控制臺(tái)懸浮窗。
console.clear()
- 清空控制臺(tái)。
2、控制臺(tái)輸出信息的幾種方式
console.log([data][, …args])
- data {any}
- ...args {any}
打印到控制臺(tái),并帶上換行符。 可以傳入多個(gè)參數(shù)
該函數(shù)也可以作為全局函數(shù)使用。
console.trace([data][, …args])
- data {any}
- ...args {any}
與console.log類似,同時(shí)會(huì)打印出調(diào)用這個(gè)函數(shù)所在的調(diào)用棧信息(即當(dāng)前運(yùn)行的文件、行數(shù)等信息)。
console.trace('Show me'); // 打印: (堆棧跟蹤會(huì)根據(jù)被調(diào)用的跟蹤的位置而變化) // Show me // at <test>:7print(text[, …args])
- text {string} | {Object} 要打印到控制臺(tái)的信息
相當(dāng)于log(text)。
3、控制臺(tái)信息的輸出樣式
console.verbose([data][, …args])
- data {any}
- ...args {any}
與console.log類似,但輸出結(jié)果以灰色字體顯示。輸出優(yōu)先級(jí)低于log,用于輸出觀察性質(zhì)的信息。
console.info([data][, …args])
- data {any}
- ...args {any}
與console.log類似,但輸出結(jié)果以綠色字體顯示。輸出優(yōu)先級(jí)高于log, 用于輸出重要信息。
console.warn([data][, …args])
- data {any}
- ...args {any}
與console.log類似,但輸出結(jié)果以藍(lán)色字體顯示。輸出優(yōu)先級(jí)高于info, 用于輸出警告信息。
console.error([data][, …args])
- data {any}
- ...args {any}
與console.log類似,但輸出結(jié)果以紅色字體顯示。輸出優(yōu)先級(jí)高于warn, 用于輸出錯(cuò)誤信息。
console.assert(value, message)
- value {any} 要斷言的布爾值
- message {string} value為false時(shí)要輸出的信息
斷言。如果value為false則輸出錯(cuò)誤信息message并停止腳本運(yùn)行。
var a = 1 + 1; console.assert(a == 2, "加法出錯(cuò)啦");4、控制臺(tái)計(jì)時(shí)操作
console.time([label])
- label {String} 計(jì)時(shí)器標(biāo)簽,可省略
啟動(dòng)一個(gè)定時(shí)器,用以計(jì)算一個(gè)操作的持續(xù)時(shí)間。 定時(shí)器由一個(gè)唯一的 label 標(biāo)識(shí)。 當(dāng)調(diào)用 console.timeEnd() 時(shí),可以使用相同的 label 來停止定時(shí)器,并以毫秒為單位將持續(xù)時(shí)間輸出到控制臺(tái)。 重復(fù)啟動(dòng)同一個(gè)標(biāo)簽的定時(shí)器會(huì)覆蓋之前啟動(dòng)同一標(biāo)簽的定時(shí)器。
console.timeEnd(label)
- label {String} 計(jì)時(shí)器標(biāo)簽
停止之前通過調(diào)用 console.time() 啟動(dòng)的定時(shí)器,并打印結(jié)果到控制臺(tái)。 調(diào)用 console.timeEnd() 后定時(shí)器會(huì)被刪除。如果不存在標(biāo)簽指定的定時(shí)器則會(huì)打印 NaNms。
console.time('求和'); var sum = 0; for(let i = 0; i < 100000; i++){sum += i; } console.timeEnd('求和'); // 打印 求和: xxx ms5、控制臺(tái)輸入框(無效)
console.input(data[, …args])
- data {any}
- ...args {any}
與console.log一樣輸出信息,并在控制臺(tái)顯示輸入框等待輸入。按控制臺(tái)的確認(rèn)按鈕后會(huì)將輸入的字符串用eval計(jì)算后返回。
部分機(jī)型可能會(huì)有控制臺(tái)不顯示輸入框的情況,屬于bug。
例如:
var n = console.input("請(qǐng)輸入一個(gè)數(shù)字:"); //輸入123之后: toast(n + 1); //顯示124console.rawInput(data[, …args])
- data {any}
- ...args {any}
與console.log一樣輸出信息,并在控制臺(tái)顯示輸入框等待輸入。按控制臺(tái)的確認(rèn)按鈕后會(huì)將輸入的字符串直接返回。
部分機(jī)型可能會(huì)有控制臺(tái)不顯示輸入框的情況,屬于bug。
例如:
var n = console.rawInput("請(qǐng)輸入一個(gè)數(shù)字:"); //輸入123之后:toast(n + 1); //顯示12316、控制臺(tái)的大小和位置設(shè)置
console.setSize(w, h)
- w {number} 寬度
- h {number} 高度
設(shè)置控制臺(tái)的大小,單位像素。
console.show(); sleep(2000) //設(shè)置控制臺(tái)大小為屏幕的四分之一 console.setSize(device.width / 2, device.height / 2);console.setPosition(x, y)
- x {number} 橫坐標(biāo)
- y {number} 縱坐標(biāo)
設(shè)置控制臺(tái)的位置,單位像素。
console.show(); console.setPosition(100, 100);基于坐標(biāo)的操作 - CoordinatesBasedAutomation
本章節(jié)介紹了一些使用坐標(biāo)進(jìn)行點(diǎn)擊、滑動(dòng)的函數(shù)。
這些函數(shù)有的需要安卓7.0以上,有的需要root權(quán)限。
要獲取要點(diǎn)擊的位置的坐標(biāo),可以在開發(fā)者選項(xiàng)中開啟"指針位置"。
//獲取這個(gè)控件 var widget = id("xxx").findOne();//獲取其中心位置并點(diǎn)擊 click(widget.bounds().centerX(), widget.bounds().centerY());//如果用root權(quán)限則用Tap1、設(shè)置屏幕的寬度和高度
setScreenMetrics(width, height)
- width {number} 屏幕寬度,單位像素
- height {number} 屏幕高度,單位像素
設(shè)置腳本坐標(biāo)點(diǎn)擊所適合的屏幕寬高。如果腳本運(yùn)行時(shí),屏幕寬度不一致會(huì)自動(dòng)放縮坐標(biāo)。
例如在1920*1080的設(shè)備中,某個(gè)操作的代碼為setScreenMetrics(1080, 1920); click(800, 200); longClick(300, 500);那么在其他設(shè)備上AutoJs會(huì)自動(dòng)放縮坐標(biāo)以便腳本仍然有效。例如在540 * 960的屏幕中click(800, 200)實(shí)際上會(huì)點(diǎn)擊位置(400, 100)2、免root手機(jī)的三種模擬點(diǎn)擊方式
click(x, y)
- 模擬點(diǎn)擊坐標(biāo)(x, y),并返回是否點(diǎn)擊成功。只有在點(diǎn)擊執(zhí)行完成后腳本才繼續(xù)執(zhí)行。
一般而言,只有點(diǎn)擊過程(大約150毫秒)中被其他事件中斷(例如用戶自行點(diǎn)擊)才會(huì)點(diǎn)擊失敗。
使用該函數(shù)模擬連續(xù)點(diǎn)擊時(shí)可能有點(diǎn)擊速度過慢的問題,這時(shí)可以用press()函數(shù)代替。
longClick(x, y)
- 模擬長(zhǎng)按坐標(biāo)(x, y), 并返回是否成功。只有在長(zhǎng)按執(zhí)行完成(大約600毫秒)時(shí)腳本才會(huì)繼續(xù)執(zhí)行。
press(x, y, duration)
- 模擬按住坐標(biāo)(x, y), 并返回是否成功。只有按住操作執(zhí)行完成時(shí)腳本才會(huì)繼續(xù)執(zhí)行。
3、免root手機(jī)的三種模擬滑動(dòng)方式
swipe(x1, y1, x2, y2, duration)
- x1 {number} 滑動(dòng)的起始坐標(biāo)的x值
- y1 {number} 滑動(dòng)的起始坐標(biāo)的y值
- x2 {number} 滑動(dòng)的結(jié)束坐標(biāo)的x值
- y2 {number} 滑動(dòng)的結(jié)束坐標(biāo)的y值
- duration {number} 滑動(dòng)時(shí)長(zhǎng),單位毫秒
模擬從坐標(biāo)(x1, y1)滑動(dòng)到坐標(biāo)(x2, y2),并返回是否成功。只有滑動(dòng)操作執(zhí)行完成時(shí)腳本才會(huì)繼續(xù)執(zhí)行。
gesture(duration, [x1, y1], [x2, y2], …)
- duration {number} 手勢(shì)的時(shí)長(zhǎng)
- [x, y] … 手勢(shì)滑動(dòng)路徑的一系列坐標(biāo)
模擬手勢(shì)操作。例如gesture(1000, [0, 0], [500, 500], [500, 1000])為模擬一個(gè)從(0, 0)到(500, 500)到(500, 100)的手勢(shì)操作,時(shí)長(zhǎng)為2秒。
gestures([delay1, duration1, [x1, y1], [x2, y2], …], [delay2, duration2, [x3, y3], [x4, y4], …], …)
同時(shí)模擬多個(gè)手勢(shì)。每個(gè)手勢(shì)的參數(shù)為[delay, duration, 坐標(biāo)], delay為延遲多久(毫秒)才執(zhí)行該手勢(shì);duration為手勢(shì)執(zhí)行時(shí)長(zhǎng);坐標(biāo)為手勢(shì)經(jīng)過的點(diǎn)的坐標(biāo)。
其中delay參數(shù)可以省略,默認(rèn)為0。
例如手指捏合:
gestures([0, 500, [800, 300], [500, 1000]],[0, 500, [300, 1500], [500, 1000]]);4、使用root權(quán)限模擬點(diǎn)擊
RootAutomator是一個(gè)使用root權(quán)限來模擬觸摸的對(duì)象,用它可以完成觸摸與多點(diǎn)觸摸,并且這些動(dòng)作的執(zhí)行沒有延遲。
一個(gè)腳本中最好只存在一個(gè)RootAutomator,并且保證腳本結(jié)束退出他??梢栽趀xit事件中退出RootAutomator,例如:
var ra = new RootAutomator(); events.on('exit', function(){ra.exit(); }); //執(zhí)行一些點(diǎn)擊操作 ...RootAutomator.tap(x, y[, id])
- x {number} 橫坐標(biāo)
- y {number} 縱坐標(biāo)
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1,可以通過setDefaultId指定。
點(diǎn)擊位置(x, y)。其中id是一個(gè)整數(shù)值,用于區(qū)分多點(diǎn)觸摸,不同的id表示不同的"手指",例如:
var ra = new RootAutomator(); //讓"手指1"點(diǎn)擊位置(100, 100) ra.tap(100, 100, 1); //讓"手指2"點(diǎn)擊位置(200, 200); ra.tap(200, 200, 2); ra.exit();如果不需要多點(diǎn)觸摸,則不需要id這個(gè)參數(shù)。 多點(diǎn)觸摸通常用于手勢(shì)或游戲操作,例如模擬雙指捏合、雙指上滑等。
某些情況下可能存在tap點(diǎn)擊無反應(yīng)的情況,這時(shí)可以用RootAutomator.press()函數(shù)代替。
RootAutomator.press(x, y, duration[, id])
- x {number} 橫坐標(biāo)
- y {number} 縱坐標(biāo)
- duration {number} 按下時(shí)長(zhǎng)
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1
模擬按下位置(x, y),時(shí)長(zhǎng)為duration毫秒。
RootAutomator.longPress(x, y[, id])
- x {number} 橫坐標(biāo)
- y {number} 縱坐標(biāo)
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1
模擬長(zhǎng)按位置(x, y)。
以上為簡(jiǎn)單模擬觸摸操作的函數(shù)。如果要模擬一些復(fù)雜的手勢(shì),需要更底層的函數(shù)。
5、使用root權(quán)限模擬滑動(dòng)(無效果)
RootAutomator.swipe(x1, x2, y1, y2[, duration, id])
- x1 {number} 滑動(dòng)起點(diǎn)橫坐標(biāo)
- y1 {number} 滑動(dòng)起點(diǎn)縱坐標(biāo)
- x2 {number} 滑動(dòng)終點(diǎn)橫坐標(biāo)
- y2 {number} 滑動(dòng)終點(diǎn)縱坐標(biāo)
- duration {number} 滑動(dòng)時(shí)長(zhǎng),單位毫秒,默認(rèn)值為300
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1
模擬一次從(x1, y1)到(x2, y2)的時(shí)間為duration毫秒的滑動(dòng)。
6、使用root權(quán)限實(shí)現(xiàn)模擬拖動(dòng)
RootAutomator.touchDown(x, y[, id])
- x {number} 橫坐標(biāo)
- y {number} 縱坐標(biāo)
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1
模擬手指按下位置(x, y)。
RootAutomator.touchMove(x, y[, id])
- x {number} 橫坐標(biāo)
- y {number} 縱坐標(biāo)
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1
模擬移動(dòng)手指到位置(x, y)。
RootAutomator.touchUp([id])
- id {number} 多點(diǎn)觸摸id,可選,默認(rèn)為1
模擬手指彈起。
7、使用root權(quán)限點(diǎn)擊和滑動(dòng)的簡(jiǎn)單命令
- 推薦使用RootAutomator
Tap(x, y)
- x, y {number} 要點(diǎn)擊的坐標(biāo)。
點(diǎn)擊位置(x, y), 您可以通過"開發(fā)者選項(xiàng)"開啟指針位置來確定點(diǎn)擊坐標(biāo)。
Swipe(x1, y1, x2, y2, [duration])
- x1, y1 {number} 滑動(dòng)起點(diǎn)的坐標(biāo)
- x2, y2 {number} 滑動(dòng)終點(diǎn)的坐標(biāo)
- duration {number} 滑動(dòng)動(dòng)作所用的時(shí)間
滑動(dòng)。從(x1, y1)位置滑動(dòng)到(x2, y2)位置。
設(shè)備 - Device
device模塊提供了與設(shè)備有關(guān)的信息與操作,例如獲取設(shè)備寬高,內(nèi)存使用率,IMEI,調(diào)整設(shè)備亮度、音量等。
此模塊的部分函數(shù),例如調(diào)整音量,需要"修改系統(tǒng)設(shè)置"的權(quán)限。如果沒有該權(quán)限,會(huì)拋出SecurityException并跳轉(zhuǎn)到權(quán)限設(shè)置界面。
1、獲取設(shè)備信息
device.width 設(shè)備屏幕分辨率寬度。例如1080。device.height 設(shè)備屏幕分辨率高度。例如1920。device.buildId 修訂版本號(hào),或者諸如"M4-rc20"的標(biāo)識(shí)。device.broad 設(shè)備的主板型號(hào)。device.brand 與產(chǎn)品或硬件相關(guān)的廠商品牌,如"Xiaomi", "Huawei"等。device.device 設(shè)備在工業(yè)設(shè)計(jì)中的名稱。deivce.model 設(shè)備型號(hào)。device.product 整個(gè)產(chǎn)品的名稱。device.bootloader 設(shè)備Bootloader的版本。device.hardware 設(shè)備的硬件名稱(來自內(nèi)核命令行或者/proc)。device.fingerprint 構(gòu)建(build)的唯一標(biāo)識(shí)碼。device.serial 硬件序列號(hào)。device.sdkInt 安卓系統(tǒng)API版本。例如安卓4.4的sdkInt為19。device.incrementaldevice.release Android系統(tǒng)版本號(hào)。例如"5.0", "7.1.1"。device.baseOSdevice.securityPatch 安全補(bǔ)丁程序級(jí)別。device.codename 開發(fā)代號(hào),例如發(fā)行版是"REL"。device.getIMEI() 返回設(shè)備的IMEI.device.getAndroidId() 返回設(shè)備的Android ID。 Android ID為一個(gè)用16進(jìn)制字符串表示的64位整數(shù),在設(shè)備第一次使用時(shí)隨機(jī)生成,之后不會(huì)更改,除非恢復(fù)出廠設(shè)置。device.getMacAddress() 返回設(shè)備的Mac地址。該函數(shù)需要在有WLAN連接的情況下才能獲取,否則會(huì)返回null。 可能的后續(xù)修改:未來可能增加有root權(quán)限的情況下通過root權(quán)限獲取,從而在沒有WLAN連接的情況下也能返回正確的Mac地址,因此請(qǐng)勿使用此函數(shù)判斷WLAN連接。device.getTotalMem() 返回設(shè)備內(nèi)存總量,單位字節(jié)(B)。1MB = 1024 * 1024B。device.getAvailMem() 返回設(shè)備當(dāng)前可用的內(nèi)存,單位字節(jié)(B)。device.getBattery() 0.0~100.0的浮點(diǎn)數(shù) 返回當(dāng)前電量百分比。device.isCharging() 返回設(shè)備是否正在充電。2、獲取并改變?cè)O(shè)備亮度
device.getBrightness()
返回當(dāng)前的(手動(dòng))亮度。
device.getBrightnessMode()
返回當(dāng)前亮度模式,0為手動(dòng)亮度,1為自動(dòng)亮度。
device.setBrightness(b)
b {number} 亮度,
如果當(dāng)前是自動(dòng)亮度模式,該函數(shù)不會(huì)影響屏幕的亮度。
此函數(shù)需要"修改系統(tǒng)設(shè)置"的權(quán)限。如果沒有該權(quán)限,會(huì)拋出SecurityException并跳轉(zhuǎn)到權(quán)限設(shè)置界面。
device.setBrightnessMode(mode)
mode {number} 亮度模式,
0為手動(dòng)亮度,1為自動(dòng)亮度
設(shè)置當(dāng)前亮度模式。
此函數(shù)需要"修改系統(tǒng)設(shè)置"的權(quán)限。如果沒有該權(quán)限,會(huì)拋出SecurityException并跳轉(zhuǎn)到權(quán)限設(shè)置界面。
3、獲取并改變?cè)O(shè)備音量
device.getMusicVolume()
返回當(dāng)前媒體音量。
device.getNotificationVolume()
返回當(dāng)前通知音量。
device.getAlarmVolume()
返回當(dāng)前鬧鐘音量。
device.getMusicMaxVolume()
返回媒體音量的最大值。
device.getNotificationMaxVolume()
返回通知音量的最大值。
device.getAlarmMaxVolume()
返回鬧鐘音量的最大值。
device.setMusicVolume(volume)
volume {number} 音量
設(shè)置當(dāng)前媒體音量。
此函數(shù)需要"修改系統(tǒng)設(shè)置"的權(quán)限。如果沒有該權(quán)限,會(huì)拋出SecurityException并跳轉(zhuǎn)到權(quán)限設(shè)置界面。
device.setNotificationVolume(volume)
volume {number} 音量
設(shè)置當(dāng)前通知音量。
此函數(shù)需要"修改系統(tǒng)設(shè)置"的權(quán)限。如果沒有該權(quán)限,會(huì)拋出SecurityException并跳轉(zhuǎn)到權(quán)限設(shè)置界面。
device.setAlarmVolume(volume)
volume {number} 音量
設(shè)置當(dāng)前鬧鐘音量。
此函數(shù)需要"修改系統(tǒng)設(shè)置"的權(quán)限。如果沒有該權(quán)限,會(huì)拋出SecurityException并跳轉(zhuǎn)到權(quán)限設(shè)置界面。
4、獲取并改變?cè)O(shè)備屏幕狀態(tài)
device.isScreenOn()
- 返回 {boolean}
返回設(shè)備屏幕是否是亮著的。如果屏幕亮著,返回true; 否則返回false。
需要注意的是,類似于vivo xplay系列的息屏?xí)r鐘不屬于"屏幕亮著"的情況,雖然屏幕確實(shí)亮著但只能顯示時(shí)鐘而且不可交互,此時(shí)isScreenOn()也會(huì)返回false。
device.wakeUp()
喚醒設(shè)備。包括喚醒設(shè)備CPU、屏幕等??梢杂脕睃c(diǎn)亮屏幕。
device.wakeUpIfNeeded()
如果屏幕沒有點(diǎn)亮,則喚醒設(shè)備。
device.keepScreenOn([timeout])
- timeout {number} 屏幕保持常亮的時(shí)間, 單位毫秒。如果不加此參數(shù),則一直保持屏幕常亮。
保持屏幕常亮。
此函數(shù)無法阻止用戶使用鎖屏鍵等正常關(guān)閉屏幕,只能使得設(shè)備在無人操作的情況下保持屏幕常亮;
同時(shí),如果此函數(shù)調(diào)用時(shí)屏幕沒有點(diǎn)亮,則會(huì)喚醒屏幕。
在某些設(shè)備上,如果不加參數(shù)timeout,只能在Auto.js的界面保持屏幕常亮,在其他界面會(huì)自動(dòng)失效,這是因?yàn)樵O(shè)備的省電策略造成的。因此,建議使用比較長(zhǎng)的時(shí)長(zhǎng)來代替"一直保持屏幕常亮"的功能,例如device.keepScreenOn(3600 * 1000)。
可以使用device.cancelKeepingAwake()來取消屏幕常亮。
//一直保持屏幕常亮 device.keepScreenOn()device.keepScreenDim([timeout])
- timeout {number} 屏幕保持常亮的時(shí)間, 單位毫秒。如果不加此參數(shù),則一直保持屏幕常亮。
保持屏幕常亮,但允許屏幕變暗來節(jié)省電量。
此函數(shù)可以用于定時(shí)腳本喚醒屏幕操作,不需要用戶觀看屏幕,可以讓屏幕變暗來節(jié)省電量。
此函數(shù)無法阻止用戶使用鎖屏鍵等正常關(guān)閉屏幕,只能使得設(shè)備在無人操作的情況下保持屏幕常亮;
同時(shí),如果此函數(shù)調(diào)用時(shí)屏幕沒有點(diǎn)亮,則會(huì)喚醒屏幕。
可以使用device.cancelKeepingAwake()來取消屏幕常亮。
device.cancelKeepingAwake()
取消設(shè)備保持喚醒狀態(tài)。
用于取消device.keepScreenOn(), device.keepScreenDim()等函數(shù)設(shè)置的屏幕常亮。
5、設(shè)置設(shè)備震動(dòng)狀態(tài)
device.vibrate(millis)
- millis {number} 震動(dòng)時(shí)間,單位毫秒
使設(shè)備震動(dòng)一段時(shí)間。
//震動(dòng)兩秒 device.vibrate(2000);device.cancelVibration()
如果設(shè)備處于震動(dòng)狀態(tài),則取消震動(dòng)。
對(duì)話框 - Dialogs
1、對(duì)話框中的回調(diào)和Promise
alert(str)
alert("hello")confirm(str)
var clear = confirm("要清除所有緩存嗎?"); if(clear){alert("清除成功!"); } "ui"; //回調(diào)的形式 confirm('你確定嗎?','這里是要寫的內(nèi)容',function(bool){if(bool){toast('你點(diǎn)擊了確定')}else{toast('你點(diǎn)擊了取消')} })//Promise形式 confirm("要清除所有緩存嗎?").then(clear => {if(clear){alert("清除成功!");} });2、對(duì)話框:alert和confirm
dialogs.alert(title[, content, callback])
- title {string} 對(duì)話框的標(biāo)題。
- content {string} 可選,對(duì)話框的內(nèi)容。默認(rèn)為空。
- callback {Function} 回調(diào)函數(shù),可選。當(dāng)用戶點(diǎn)擊確定時(shí)被調(diào)用,一般用于ui模式。
顯示一個(gè)只包含“確定”按鈕的提示對(duì)話框。直至用戶點(diǎn)擊確定腳本才繼續(xù)運(yùn)行。
該函數(shù)也可以作為全局函數(shù)使用。
alert("出現(xiàn)錯(cuò)誤~", "出現(xiàn)未知錯(cuò)誤,請(qǐng)聯(lián)系腳本作者”);在ui模式下該函數(shù)返回一個(gè)Promise。例如:
"ui";alert("嘿嘿嘿").then(()=>{//當(dāng)點(diǎn)擊確定后會(huì)執(zhí)行這里});dialogs.confirm(title[, content, callback])
- title {string} 對(duì)話框的標(biāo)題。
- content {string} 可選,對(duì)話框的內(nèi)容。默認(rèn)為空。
- callback {Function} 回調(diào)函數(shù),可選。當(dāng)用戶點(diǎn)擊確定時(shí)被調(diào)用,一般用于ui模式。
顯示一個(gè)包含“確定”和“取消”按鈕的提示對(duì)話框。如果用戶點(diǎn)擊“確定”則返回 true ,否則返回 false 。
該函數(shù)也可以作為全局函數(shù)使用。
在ui模式下該函數(shù)返回一個(gè)Promise。例如:
"ui"; confirm("確定嗎").then(value=>{//當(dāng)點(diǎn)擊確定后會(huì)執(zhí)行這里, value為true或false, 表示點(diǎn)擊"確定"或"取消"});3、對(duì)話框:rawInput和input
dialogs.rawInput(title[, prefill, callback])
- title {string} 對(duì)話框的標(biāo)題。
- prefill {string} 輸入框的初始內(nèi)容,可選,默認(rèn)為空。
- callback {Function} 回調(diào)函數(shù),可選。當(dāng)用戶點(diǎn)擊確定時(shí)被調(diào)用,一般用于ui模式。
顯示一個(gè)包含輸入框的對(duì)話框,等待用戶輸入內(nèi)容,并在用戶點(diǎn)擊確定時(shí)將輸入的字符串返回。如果用戶取消了輸入,返回null。
該函數(shù)也可以作為全局函數(shù)使用。
var name = rawInput("請(qǐng)輸入您的名字", "小明"); alert("您的名字是" + name);在ui模式下該函數(shù)返回一個(gè)Promise。例如:
"ui"; rawInput("請(qǐng)輸入您的名字", "小明").then(name => {alert("您的名字是" + name); });當(dāng)然也可以使用回調(diào)函數(shù),例如:
rawInput("請(qǐng)輸入您的名字", "小明", name => {alert("您的名字是" + name); });dialogs.input(title[, prefill, callback])
等效于 eval(dialogs.rawInput(title, prefill, callback)), 該函數(shù)和rawInput的區(qū)別在于,會(huì)把輸入的字符串用eval計(jì)算一遍再返回,返回的可能不是字符串。
可以用該函數(shù)輸入數(shù)字、數(shù)組等。例如:
var age = dialogs.input("請(qǐng)輸入您的年齡", "18");// new Date().getYear() + 1900 可獲取當(dāng)前年份var year = new Date().getYear() + 1900 - age;alert("您的出生年份是" + year);在ui模式下該函數(shù)返回一個(gè)Promise。例如:
"ui"; dialogs.input("請(qǐng)輸入您的年齡", "18").then(age => {var year = new Date().getYear() + 1900 - age;alert("您的出生年份是" + year); });4、對(duì)話框:選項(xiàng)列表
dialogs.select(title, items, callback)
- title {string} 對(duì)話框的標(biāo)題。
- items {Array} 對(duì)話框的選項(xiàng)列表,是一個(gè)字符串?dāng)?shù)組。
- callback {Function} 回調(diào)函數(shù),可選。當(dāng)用戶點(diǎn)擊確定時(shí)被調(diào)用,一般用于ui模式。
顯示一個(gè)帶有選項(xiàng)列表的對(duì)話框,等待用戶選擇,返回用戶選擇的選項(xiàng)索引(0 ~ item.length - 1)。如果用戶取消了選擇,返回-1。
var options = ["選項(xiàng)A", "選項(xiàng)B", "選項(xiàng)C", "選項(xiàng)D"]var i = dialogs.select("請(qǐng)選擇一個(gè)選項(xiàng)", options);if(i >= 0){toast("您選擇的是" + options[i]); }else{toast("您取消了選擇"); }在ui模式下該函數(shù)返回一個(gè)Promise。例如:
"ui";dialogs.select("請(qǐng)選擇一個(gè)選項(xiàng)", ["選項(xiàng)A", "選項(xiàng)B", "選項(xiàng)C", "選項(xiàng)D"]).then(i => {toast(i); });5、對(duì)話框:單選和多選
dialogs.singleChoice(title, items[, index, callback])
- title {string} 對(duì)話框的標(biāo)題。
- items {Array} 對(duì)話框的選項(xiàng)列表,是一個(gè)字符串?dāng)?shù)組。
- index {number} 對(duì)話框的初始選項(xiàng)的位置,默認(rèn)為0。
- callback {Function} 回調(diào)函數(shù),可選。當(dāng)用戶點(diǎn)擊確定時(shí)被調(diào)用,一般用于ui模式。
顯示一個(gè)單選列表對(duì)話框,等待用戶選擇,返回用戶選擇的選項(xiàng)索引(0 ~ item.length - 1)。如果用戶取消了選擇,返回-1。
dialogs.multiChoice(title, items[, indices, callback])
- title {string} 對(duì)話框的標(biāo)題。
- items {Array} 對(duì)話框的選項(xiàng)列表,是一個(gè)字符串?dāng)?shù)組。
- indices {Array} 選項(xiàng)列表中初始選中的項(xiàng)目索引的數(shù)組,默認(rèn)為空數(shù)組。
- callback {Function} 回調(diào)函數(shù),可選。當(dāng)用戶點(diǎn)擊確定時(shí)被調(diào)用,一般用于ui模式。
顯示一個(gè)多選列表對(duì)話框,等待用戶選擇,返回用戶選擇的選項(xiàng)索引的數(shù)組。如果用戶取消了選擇,返回[]。
在ui模式下該函數(shù)返回一個(gè)Promise。
對(duì)話框 - Dialogs
主講:阿濤 QQ/微信:656206105
微信公眾號(hào):立體空間
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-d3w3Fq7j-1638930432645)(dyh.jpg)]
6、對(duì)話框:自定義對(duì)話框
dialogs.build(properties)
- properties {Object} 對(duì)話框?qū)傩?#xff0c;用于配置對(duì)話框。
- 返回 {Dialog}
創(chuàng)建一個(gè)可自定義的對(duì)話框,例如:
dialogs.build({//對(duì)話框標(biāo)題title: "發(fā)現(xiàn)新版本",//對(duì)話框內(nèi)容content: "更新日志: 新增了若干了BUG",//確定鍵內(nèi)容positive: "下載",//取消鍵內(nèi)容negative: "取消",//中性鍵內(nèi)容neutral: "到瀏覽器下載",//勾選框內(nèi)容checkBoxPrompt: "不再提示" }).show()選項(xiàng)properties可供配置的項(xiàng)目為:
-
title {string} 對(duì)話框標(biāo)題
-
titleColor {string} | {number} 對(duì)話框標(biāo)題的顏色
-
buttonRippleColor {string} | {number} 對(duì)話框按鈕的波紋效果顏色
-
icon {string} | {Image} 對(duì)話框的圖標(biāo),是一個(gè)URL或者圖片對(duì)象
-
content {string} 對(duì)話框文字內(nèi)容
-
contentColor{string} | {number} 對(duì)話框文字內(nèi)容的顏色
-
contentLineSpacing{number} 對(duì)話框文字內(nèi)容的行高倍數(shù),1.0為一倍行高
-
items {Array} 對(duì)話框列表的選項(xiàng)
-
itemsColor {string} | {number} 對(duì)話框列表的選項(xiàng)的文字顏色
- itemsSelectMode
{string} 對(duì)話框列表的選項(xiàng)選擇模式,可以為:
- select 普通選擇模式
- single 單選模式
- multi 多選模式
-
itemsSelectedIndex {number} | {Array} 對(duì)話框列表中預(yù)先選中的項(xiàng)目索引,如果是單選模式為一個(gè)索引;多選模式則為數(shù)組
-
positive {string} 對(duì)話框確定按鈕的文字內(nèi)容(最右邊按鈕)
-
positiveColor {string} | {number} 對(duì)話框確定按鈕的文字顏色(最右邊按鈕)
-
neutral {string} 對(duì)話框中立按鈕的文字內(nèi)容(最左邊按鈕)
-
neutralColor {string} | {number} 對(duì)話框中立按鈕的文字顏色(最左邊按鈕)
-
negative {string} 對(duì)話框取消按鈕的文字內(nèi)容(確定按鈕左邊的按鈕)
-
negativeColor {string} | {number} 對(duì)話框取消按鈕的文字顏色(確定按鈕左邊的按鈕)
-
checkBoxPrompt {string} 勾選框文字內(nèi)容
-
checkBoxChecked {boolean} 勾選框是否勾選
- progress
{Object} 配置對(duì)話框進(jìn)度條的對(duì)象:
- max {number} 進(jìn)度條的最大值,如果為-1則為無限循環(huán)的進(jìn)度條
- horizontal {boolean} 如果為true, 則對(duì)話框無限循環(huán)的進(jìn)度條為水平進(jìn)度條
- showMinMax {boolean} 是否顯示進(jìn)度條的最大值和最小值
-
cancelable {boolean} 對(duì)話框是否可取消,如果為false,則對(duì)話框只能用代碼手動(dòng)取消
-
canceledOnTouchOutside {boolean} 對(duì)話框是否在點(diǎn)擊對(duì)話框以外區(qū)域時(shí)自動(dòng)取消,默認(rèn)為true
-
inputHint {string} 對(duì)話框的輸入框的輸入提示
-
inputPrefill {string} 對(duì)話框輸入框的默認(rèn)輸入內(nèi)容
通過這些選項(xiàng)可以自定義一個(gè)對(duì)話框,并通過監(jiān)聽返回的Dialog對(duì)象的按鍵、輸入事件來實(shí)現(xiàn)交互。
7、對(duì)話框事件:顯示和消失事件
事件: show
- dialog {Dialog} 對(duì)話框
對(duì)話框顯示時(shí)會(huì)觸發(fā)的事件。例如:
dialogs.build({title: "標(biāo)題" }).on("show", (dialog)=>{toast("對(duì)話框顯示了"); }).show();事件: dismiss
- dialog {Dialog} 對(duì)話框
對(duì)話框消失時(shí)會(huì)觸發(fā)的事件。對(duì)話框被取消或者手動(dòng)調(diào)用dialog.dismiss()函數(shù)都會(huì)觸發(fā)該事件。例如:
var d = dialogs.build({title: "標(biāo)題",positive: "確定",negative: "取消" }).on("dismiss", (dialog)=>{toast("對(duì)話框消失了"); }).show();setTimeout(()=>{d.dismiss(); }, 5000);8、對(duì)話框事件:按鈕事件
事件: positive
- dialog {Dialog} 對(duì)話框
確定按鈕按下時(shí)觸發(fā)的事件。例如:
var d = dialogs.build({title: "標(biāo)題",positive: "確定",negative: "取消" }).on("positive", (dialog)=>{toast("你點(diǎn)擊了確定"); }).show();事件: negative
- dialog {Dialog} 對(duì)話框
取消按鈕按下時(shí)觸發(fā)的事件。例如:
var d = dialogs.build({title: "標(biāo)題",positive: "確定",negative: "取消" }).on("negative", (dialog)=>{toast("你點(diǎn)擊了取消"); }).show();事件: cancel
- dialog {Dialog} 對(duì)話框
對(duì)話框被取消時(shí)會(huì)觸發(fā)的事件。一個(gè)對(duì)話框可能按取消按鈕、返回鍵取消或者點(diǎn)擊對(duì)話框以外區(qū)域取消。例如:
dialogs.build({title: "標(biāo)題",positive: "確定",negative: "取消" }).on("cancel", (dialog)=>{toast("對(duì)話框取消了"); }).show();事件: neutral
- dialog {Dialog} 對(duì)話框
中性按鈕按下時(shí)觸發(fā)的事件。例如:
var d = dialogs.build({title: "標(biāo)題",positive: "確定",negative: "取消",neutral: "稍后提示" }).on("positive", (dialog)=>{toast("你點(diǎn)擊了稍后提示"); }).show();事件: any
- dialog {Dialog} 對(duì)話框
- action {string} 被點(diǎn)擊的按鈕,可能的值為:
- positive 確定按鈕
- negative 取消按鈕
- neutral 中性按鈕
任意按鈕按下時(shí)觸發(fā)的事件。例如:
var d = dialogs.build({title: "標(biāo)題",positive: "確定",negative: "取消",neutral: "稍后提示" }).on("any", (action, dialog)=>{if(action == "positive"){toast("你點(diǎn)擊了確定");}else if(action == "negative"){toast("你點(diǎn)擊了取消");} }).show();9、對(duì)話框事件:單選多選事件
事件: item_select
- index {number} 被選中的項(xiàng)目索引,從0開始
- item {Object} 被選中的項(xiàng)目
- dialog {Dialog} 對(duì)話框
對(duì)話框列表(itemsSelectMode為"select")的項(xiàng)目被點(diǎn)擊選中時(shí)觸發(fā)的事件。例如:
var d = dialogs.build({title: "請(qǐng)選擇",positive: "確定",negative: "取消",items: ["A", "B", "C", "D"],itemsSelectMode: "select" }).on("item_select", (index, item, dialog)=>{toast("您選擇的是第" + (index + 1) + "項(xiàng), 選項(xiàng)為" + item); }).show();事件: single_choice
- index {number} 被選中的項(xiàng)目索引,從0開始
- item {Object} 被選中的項(xiàng)目
- dialog {Dialog} 對(duì)話框
對(duì)話框單選列表(itemsSelectMode為"singleChoice")的項(xiàng)目被選中并點(diǎn)擊確定時(shí)觸發(fā)的事件。例如:
dialogs.build({title: '這是選擇框事件',items: ['A','B','C','D'],itemsSelectMode: 'single',itemsSelectedIndex: 0,positive: '確定' }).on('single_choice',function(index,item,dialog){toastLog(index+"----"+item)// 3----DtoastLog("你選擇的是第"+(index+1).toString()+"個(gè)選項(xiàng):"+item) }).show()事件: multi_choice 【失效】
- indices {Array} 被選中的項(xiàng)目的索引的數(shù)組
- items {Array} 被選中的項(xiàng)目的數(shù)組
- dialog {Dialog} 對(duì)話框
對(duì)話框多選列表(itemsSelectMode為"multiChoice")的項(xiàng)目被選中并點(diǎn)擊確定時(shí)觸發(fā)的事件。例如:
var d = dialogs.build({title: "請(qǐng)選擇",positive: "確定",negative: "取消",items: ["A", "B", "C", "D"],itemsSelectMode: "multiChoice" }).on("item_select", (indices, items, dialog)=>{toast(util.format("您選擇的項(xiàng)目為%o, 選項(xiàng)為%o", indices, items); }).show();10、對(duì)話框事件:輸入事件
事件: input
- text {string} 輸入框的內(nèi)容
- dialog {Dialog} 對(duì)話框
帶有輸入框的對(duì)話框當(dāng)點(diǎn)擊確定時(shí)會(huì)觸發(fā)的事件。例如:
dialogs.build({title: "請(qǐng)輸入",positive: "確定",negative: "取消",inputPrefill: "" }).on("input", (text, dialog)=>{toast("你輸入的是" + text); }).show();事件: input_change
- text {string} 輸入框的內(nèi)容
- dialog {Dialog} 對(duì)話框
對(duì)話框的輸入框的文本發(fā)生變化時(shí)會(huì)觸發(fā)的事件。例如:
dialogs.build({title: "請(qǐng)輸入",positive: "確定",negative: "取消",inputPrefill: "" }).on("input_change", (text, dialog)=>{toast("你輸入的是" + text); }).show();11、對(duì)話框?qū)ο蠓椒?/h1>
dialog.getProgress()
- 返回 {number}
獲取當(dāng)前進(jìn)度條的進(jìn)度值,是一個(gè)整數(shù)
dialog.getMaxProgress()
- 返回 {number}
獲取當(dāng)前進(jìn)度條的最大進(jìn)度值,是一個(gè)整數(shù)
dialog.getActionButton(action)
action {string} 動(dòng)作,包括:
- positive
- negative
- neutral
事件與監(jiān)聽 - Events
1、什么是事件與監(jiān)聽
events模塊提供了監(jiān)聽手機(jī)通知、按鍵、觸摸的接口。您可以用他配合自動(dòng)操作函數(shù)完成自動(dòng)化工作。
events本身是一個(gè)EventEmiiter, 但內(nèi)置了一些事件、包括按鍵事件、通知事件、Toast事件等。
需要注意的是,事件的處理是單線程的,并且仍然在原線程執(zhí)行,如果腳本主體或者其他事件處理中有耗時(shí)操作、輪詢等,則事件將無法得到及時(shí)處理(會(huì)進(jìn)入事件隊(duì)列等待腳本主體或其他事件處理完成才執(zhí)行)。例如:
auto();//啟用按鍵監(jiān)聽 events.observeKey(); //監(jiān)聽音量上鍵按下 events.onKeyDown("volume_up", function(event){//這里不會(huì)被執(zhí)行toast("音量上鍵被按下了"); });while(true){//死循環(huán) }2、監(jiān)聽按鍵事件
events.observeKey()
啟用按鍵監(jiān)聽,例如音量鍵、Home鍵。按鍵監(jiān)聽使用無障礙服務(wù)實(shí)現(xiàn),如果無障礙服務(wù)未啟用會(huì)拋出異常并提示開啟。
只有這個(gè)函數(shù)成功執(zhí)行后, onKeyDown, onKeyUp等按鍵事件的監(jiān)聽才有效。
該函數(shù)在安卓4.3以上才能使用。
events.onKeyDown(keyName, listener)
- keyName {string} 要監(jiān)聽的按鍵名稱
- listener {Function} 按鍵監(jiān)聽器。參數(shù)為一個(gè)KeyEvent
注冊(cè)一個(gè)按鍵監(jiān)聽函數(shù),當(dāng)有keyName對(duì)應(yīng)的按鍵被按下會(huì)調(diào)用該函數(shù)。
按鍵事件中所有可用的按鍵名稱為:
- volume_up 音量上鍵
- volume_down 音量下鍵
- home 主屏幕鍵
- back 返回鍵
- menu 菜單鍵
例如:
//啟用按鍵監(jiān)聽 events.observeKey(); //監(jiān)聽音量上鍵按下 events.onKeyDown("volume_up", function(event){toast("音量上鍵被按下了"); }); //監(jiān)聽菜單鍵按下 events.onKeyDown("menu", function(event){toast("菜單鍵被按下了");exit(); });events.onKeyUp(keyName, listener)
- keyName {string} 要監(jiān)聽的按鍵名稱
- listener {Function} 按鍵監(jiān)聽器。參數(shù)為一個(gè)KeyEvent。
注冊(cè)一個(gè)按鍵監(jiān)聽函數(shù),當(dāng)有keyName對(duì)應(yīng)的按鍵彈起會(huì)調(diào)用該函數(shù)。
按鍵事件中所有可用的按鍵名稱為:
- volume_up 音量上鍵
- volume_down 音量下鍵
- home 主屏幕鍵
- back 返回鍵
- menu 菜單鍵
一次完整的按鍵動(dòng)作包括了按鍵按下和彈起。按下事件會(huì)在手指按下一個(gè)按鍵的"瞬間"觸發(fā), 彈起事件則在手指放開這個(gè)按鍵時(shí)觸發(fā)。
例如:
//啟用按鍵監(jiān)聽 events.observeKey(); //監(jiān)聽音量下鍵彈起 events.onKeyDown("volume_down", function(event){toast("音量上鍵彈起"); }); //監(jiān)聽Home鍵彈起 events.onKeyDown("home", function(event){toast("Home鍵彈起");exit(); });3、KeyEvent對(duì)象方法
KeyEvent.getAction()
返回事件的動(dòng)作。包括:
- KeyEvent.ACTION_DOWN 按下事件
- KeyEvent.ACTION_UP 彈起事件
KeyEvent.getKeyCode()
返回按鍵的鍵值。包括:
- KeyEvent.KEYCODE_HOME 主頁(yè)鍵
- KeyEvent.KEYCODE_BACK 返回鍵
- KeyEvent.KEYCODE_MENU 菜單鍵
- KeyEvent.KEYCODE_VOLUME_UP 音量上鍵
- KeyEvent.KEYCODE_VOLUME_DOWN 音量下鍵
KeyEvent.getEventTime()
- 返回 {number}
返回事件發(fā)生的時(shí)間戳。
KeyEvent.getDownTime()
返回最近一次按下事件的時(shí)間戳。如果本身是按下事件,則與getEventTime()相同。
KeyEvent.keyCodeToString(keyCode)
把鍵值轉(zhuǎn)換為字符串。例如24轉(zhuǎn)換為"KEYCODE_HOME"。
4、事件:key、key_down、key_up
事件: ‘key’
- keyCode {number} 鍵值
- event {KeyEvent} 事件
當(dāng)有按鍵被按下或彈起時(shí)會(huì)觸發(fā)該事件。 例如:
auto(); events.observeKey(); events.on("key", function(keyCode, event){//處理按鍵事件 });其中監(jiān)聽器的參數(shù)KeyCode包括:
- keys.home 主頁(yè)鍵
- keys.back 返回鍵
- keys.menu 菜單鍵
- keys.volume_up 音量上鍵
- keys.volume_down 音量下鍵
例如:
auto(); events.observeKey(); events.on("key", function(keyCode, event){if(keyCode == keys.menu && event.getAction() == event.ACTION_UP){toast("菜單鍵按下");} });事件: ‘key_down’
- keyCode {number} 鍵值
- event {KeyEvent} 事件
當(dāng)有按鍵被按下時(shí)會(huì)觸發(fā)該事件。
auto(); events.observeKey(); events.on("key_down", function(keyCode, event){//處理按鍵按下事件 });事件: ‘key_up’
- keyCode {number} 鍵值
- event {KeyEvent} 事件
當(dāng)有按鍵彈起時(shí)會(huì)觸發(fā)該事件。
auto(); events.observeKey(); events.on("key_up", function(keyCode, event){//處理按鍵彈起事件 });5、單次監(jiān)聽按鍵事件
events.onceKeyDown(keyName, listener)
- keyName {string} 要監(jiān)聽的按鍵名稱
- listener {Function} 按鍵監(jiān)聽器。參數(shù)為一個(gè)KeyEvent
注冊(cè)一個(gè)按鍵監(jiān)聽函數(shù),當(dāng)有keyName對(duì)應(yīng)的按鍵被按下時(shí)會(huì)調(diào)用該函數(shù),之后會(huì)注銷該按鍵監(jiān)聽器。
也就是listener只有在onceKeyDown調(diào)用后的第一次按鍵事件被調(diào)用一次。
events.onceKeyUp(keyName, listener)
- keyName {string} 要監(jiān)聽的按鍵名稱
- listener {Function} 按鍵監(jiān)聽器。參數(shù)為一個(gè)KeyEvent
注冊(cè)一個(gè)按鍵監(jiān)聽函數(shù),當(dāng)有keyName對(duì)應(yīng)的按鍵彈起時(shí)會(huì)調(diào)用該函數(shù),之后會(huì)注銷該按鍵監(jiān)聽器。
也就是listener只有在onceKeyUp調(diào)用后的第一次按鍵事件被調(diào)用一次。
6、刪除按鍵事件的監(jiān)聽
events.removeAllKeyDownListeners(keyName)
- keyName {string} 按鍵名稱
刪除該按鍵的KeyDown(按下)事件的所有監(jiān)聽。
events.removeAllKeyUpListeners(keyName)
- keyName {string} 按鍵名稱
刪除該按鍵的KeyUp(彈起)事件的所有監(jiān)聽。
7、屏蔽原有按鍵功能
events.setKeyInterceptionEnabled([key, ]enabled)
- enabled {boolean}
- key {string} 要屏蔽的按鍵
設(shè)置按鍵屏蔽是否啟用。所謂按鍵屏蔽指的是,屏蔽原有按鍵的功能,例如使得音量鍵不再能調(diào)節(jié)音量,但此時(shí)仍然能通過按鍵事件監(jiān)聽按鍵。
如果不加參數(shù)key則會(huì)屏蔽所有按鍵。
例如,調(diào)用events.setKeyInterceptionEnabled(true)會(huì)使系統(tǒng)的音量、Home、返回等鍵不再具有調(diào)節(jié)音量、回到主頁(yè)、返回的作用,但此時(shí)仍然能通過按鍵事件監(jiān)聽按鍵。
該函數(shù)通常于按鍵監(jiān)聽結(jié)合,例如想監(jiān)聽音量鍵并使音量鍵按下時(shí)不彈出音量調(diào)節(jié)框則為:
events.setKeyInterceptionEnabled("volume_up", true); events.observeKey(); events.onKeyDown("volume_up", ()=>{log("音量上鍵被按下"); });只要有一個(gè)腳本屏蔽了某個(gè)按鍵,該按鍵便會(huì)被屏蔽;當(dāng)腳本退出時(shí),會(huì)自動(dòng)解除所有按鍵屏蔽。
8、屏幕觸摸事件監(jiān)聽(需要root權(quán)限)
events.observeTouch()
啟用屏幕觸摸監(jiān)聽。(需要root權(quán)限)
只有這個(gè)函數(shù)被成功執(zhí)行后, 觸摸事件的監(jiān)聽才有效。
沒有root權(quán)限調(diào)用該函數(shù)則什么也不會(huì)發(fā)生。
events.setTouchEventTimeout(timeout)
- timeout {number} 兩個(gè)觸摸事件的最小間隔。單位毫秒。默認(rèn)為10毫秒。如果number小于0,視為0處理。
設(shè)置兩個(gè)觸摸事件分發(fā)的最小時(shí)間間隔。
例如間隔為10毫秒的話,前一個(gè)觸摸事件發(fā)生并被注冊(cè)的監(jiān)聽器處理后,至少要過10毫秒才能分發(fā)和處理下一個(gè)觸摸事件,這10毫秒之間的觸摸將會(huì)被忽略。
建議在滿足需要的情況下盡量提高這個(gè)間隔。一個(gè)簡(jiǎn)單滑動(dòng)動(dòng)作可能會(huì)連續(xù)觸發(fā)上百個(gè)觸摸事件,如果timeout設(shè)置過低可能造成事件擁堵。強(qiáng)烈建議不要設(shè)置timeout為0。
events.getTouchEventTimeout()
返回觸摸事件的最小時(shí)間間隔。
events.onTouch(listener)
- listener {Function} 參數(shù)為Point的函數(shù)
注冊(cè)一個(gè)觸摸監(jiān)聽函數(shù)。相當(dāng)于on("touch", listener)。
例如:
//啟用觸摸監(jiān)聽 events.observeTouch(); //注冊(cè)觸摸監(jiān)聽器 events.onTouch(function(p){//觸摸事件發(fā)生時(shí), 打印出觸摸的點(diǎn)的坐標(biāo)log(p.x + ", " + p.y); });events.removeAllTouchListeners()
刪除所有事件監(jiān)聽函數(shù)。
9、通知事件監(jiān)聽:QQ消息、微信消息、推送等通知
events.observeNotification()
通知監(jiān)聽依賴于通知服務(wù),如果通知服務(wù)沒有運(yùn)行,會(huì)拋出異常并跳轉(zhuǎn)到通知權(quán)限開啟界面。(有時(shí)即使通知權(quán)限已經(jīng)開啟通知服務(wù)也沒有運(yùn)行,這時(shí)需要關(guān)閉權(quán)限再重新開啟一次)
例如:
events.obvereNotification(); events.onNotification(function(notification){log(notification.getText()); });事件: ‘notification’
- notification Notification通知對(duì)象
當(dāng)有應(yīng)用發(fā)出通知時(shí)會(huì)觸發(fā)該事件,參數(shù)為Notification。
例如:
events.observeNotification(); events.on("notification", function(n){log("收到新通知:\n 標(biāo)題: %s, 內(nèi)容: %s, \n包名: %s", n.getTitle(), n.getText(), n.getPackageName()); });10、Notification對(duì)象
通知對(duì)象,可以獲取通知詳情,包括通知標(biāo)題、內(nèi)容、發(fā)出通知的包名、時(shí)間等,也可以對(duì)通知進(jìn)行操作,比如點(diǎn)擊、刪除。
Notification.number
- {number}
通知數(shù)量。例如QQ連續(xù)收到兩條消息時(shí)number為2。
Notification.when
- {number}
通知發(fā)出時(shí)間的時(shí)間戳,可以用于構(gòu)造Date對(duì)象。例如:
events.observeNotification(); events.on("notification", function(n){log("通知時(shí)間為}" + new Date(n.when)); });Notification.getPackageName()
- 返回 {string}
獲取發(fā)出通知的應(yīng)用包名。
Notification.getTitle()
- 返回 {string}
獲取通知的標(biāo)題。
Notification.getText()
- 返回 {string}
獲取通知的內(nèi)容。
Notification.click()
點(diǎn)擊該通知。例如對(duì)于一條QQ消息,點(diǎn)擊會(huì)進(jìn)入具體的聊天界面。
Notification.delete()
刪除該通知。該通知將從通知欄中消失。
11、toast事件監(jiān)聽
events.observeToast()
開啟Toast監(jiān)聽。
Toast監(jiān)聽依賴于無障礙服務(wù),因此此函數(shù)會(huì)確保無障礙服務(wù)運(yùn)行。
事件: ‘toast’
- getText() 獲取Toast的文本內(nèi)容
- getPackageName() 獲取發(fā)出Toast的應(yīng)用包名
當(dāng)有應(yīng)用發(fā)出toast(氣泡消息)時(shí)會(huì)觸發(fā)該事件。但Auto.js軟件本身的toast除外。
例如,要記錄發(fā)出所有toast的應(yīng)用:
events.observeToast(); events.onToast(function(toast){log("Toast內(nèi)容: " + toast.getText() + " 包名: " + toast.getPackageName()); });12、EventEmitter對(duì)象
events本身是一個(gè)EventEmiiter, 但內(nèi)置了一些事件、包括按鍵事件、通知事件、Toast事件等。
events.emitter()
返回一個(gè)新的EventEmitter。這個(gè)EventEmitter沒有內(nèi)置任何事件。
13、EventEmitter對(duì)象:設(shè)置監(jiān)聽器數(shù)量
EventEmitter.defaultMaxListeners
每個(gè)事件默認(rèn)可以注冊(cè)最多 10 個(gè)監(jiān)聽器。 單個(gè) EventEmitter 實(shí)例的限制可以使用 emitter.setMaxListeners(n) 方法改變。
所有 EventEmitter 實(shí)例的默認(rèn)值可以使用 EventEmitter.defaultMaxListeners 屬性改變。
設(shè)置 EventEmitter.defaultMaxListeners 要謹(jǐn)慎,因?yàn)闀?huì)影響所有 EventEmitter 實(shí)例,包括之前創(chuàng)建的。 因而,調(diào)用 emitter.setMaxListeners(n) 優(yōu)先于 EventEmitter.defaultMaxListeners。
注意,與Node.js不同,這是一個(gè)硬性限制。 EventEmitter 實(shí)例不允許添加更多的監(jiān)聽器,監(jiān)聽器超過最大數(shù)量時(shí)會(huì)拋出TooManyListenersException。
EventEmitter.getMaxListeners()
返回 EventEmitter 當(dāng)前的最大監(jiān)聽器限制值,該值可以通過 emitter.setMaxListeners(n) 設(shè)置或默認(rèn)為 EventEmitter.defaultMaxListeners。
EventEmitter.setMaxListeners(n)
- n {number}
默認(rèn)情況下,如果為特定事件添加了超過 10 個(gè)監(jiān)聽器,則 EventEmitter 會(huì)打印一個(gè)警告。 此限制有助于尋找內(nèi)存泄露。 但是,并不是所有的事件都要被限為 10 個(gè)。 emitter.setMaxListeners() 方法允許修改指定的 EventEmitter 實(shí)例的限制。 值設(shè)為 Infinity(或 0)表明不限制監(jiān)聽器的數(shù)量。
返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
emitter.setMaxListeners(emitter.getMaxListeners() + 1); emitter.once('event', () => {// 做些操作emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); });14、EventEmitter對(duì)象:添加監(jiān)聽事件
EventEmitter.addListener(eventName, listener)
- eventName {any}
- listener {Function}
emitter.on(eventName, listener) 的別名。
EventEmitter.on(eventName, listener)
- eventName {any} 事件名
- listener {Function} 回調(diào)函數(shù)
添加 listener 函數(shù)到名為 eventName 的事件的監(jiān)聽器數(shù)組的末尾。 不會(huì)檢查 listener 是否已被添加。 多次調(diào)用并傳入相同的 eventName 和 listener 會(huì)導(dǎo)致 listener 被添加與調(diào)用多次。
server.on('connection', (stream) => {console.log('有連接!'); });返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
默認(rèn)情況下,事件監(jiān)聽器會(huì)按照添加的順序依次調(diào)用。 emitter.prependListener() 方法可用于將事件監(jiān)聽器添加到監(jiān)聽器數(shù)組的開頭。
const myEE = events.emitter(); myEE.on('foo', () => console.log('a')); myEE.prependListener('foo', () => console.log('b')); myEE.emit('foo'); // 打印: // b // aEventEmitter.once(eventName, listener)
- eventName {any} 事件名
- listener {Function} 回調(diào)函數(shù)
添加一個(gè)單次 listener 函數(shù)到名為 eventName 的事件。 下次觸發(fā) eventName 事件時(shí),監(jiān)聽器會(huì)被移除,然后調(diào)用。
server.once('connection', (stream) => {console.log('首次調(diào)用!'); });返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
默認(rèn)情況下,事件監(jiān)聽器會(huì)按照添加的順序依次調(diào)用。 emitter.prependOnceListener() 方法可用于將事件監(jiān)聽器添加到監(jiān)聽器數(shù)組的開頭。
const myEE = events.emitter(); myEE.once('foo', () => console.log('a')); myEE.prependOnceListener('foo', () => console.log('b')); myEE.emit('foo'); // 打印: // b // a15、EventEmitter對(duì)象:調(diào)用監(jiān)聽事件
EventEmitter.emit(eventName[, …args])
- eventName {any}
- args {any}
按監(jiān)聽器的注冊(cè)順序,同步地調(diào)用每個(gè)注冊(cè)到名為 eventName 事件的監(jiān)聽器,并傳入提供的參數(shù)。
如果事件有監(jiān)聽器,則返回 true ,否則返回 false。
16、EventEmitter對(duì)象:獲取監(jiān)聽事件
EventEmitter.eventNames()
返回一個(gè)列出觸發(fā)器已注冊(cè)監(jiān)聽器的事件的數(shù)組。 數(shù)組中的值為字符串或符號(hào)。
const myEE = events.emitter(); myEE.on('foo', () => {}); myEE.on('bar', () => {});const sym = Symbol('symbol'); myEE.on(sym, () => {});console.log(myEE.eventNames()); // 打印: [ 'foo', 'bar', Symbol(symbol) ]EventEmitter.listenerCount(eventName)
- eventName {string} 正在被監(jiān)聽的事件名
返回正在監(jiān)聽名為 eventName 的事件的監(jiān)聽器的數(shù)量。
EventEmitter.listeners(eventName)
- eventName {string}
返回名為 eventName 的事件的監(jiān)聽器數(shù)組的副本。
17、EventEmitter對(duì)象:添加監(jiān)聽事件到開頭
EventEmitter.prependListener(eventName, listener)
- eventName {any} 事件名
- listener {Function} 回調(diào)函數(shù)
添加 listener 函數(shù)到名為 eventName 的事件的監(jiān)聽器數(shù)組的開頭。 不會(huì)檢查 listener 是否已被添加。 多次調(diào)用并傳入相同的 eventName 和 listener 會(huì)導(dǎo)致 listener 被添加與調(diào)用多次。
server.prependListener('connection', (stream) => {console.log('有連接!'); });返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
EventEmitter.prependOnceListener(eventName, listener)
- eventName {any} 事件名
- listener {Function} 回調(diào)函數(shù)
添加一個(gè)單次 listener 函數(shù)到名為 eventName 的事件的監(jiān)聽器數(shù)組的開頭。 下次觸發(fā) eventName 事件時(shí),監(jiān)聽器會(huì)被移除,然后調(diào)用。
server.prependOnceListener('connection', (stream) => {console.log('首次調(diào)用!'); });返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
18、EventEmitter對(duì)象:刪除事件監(jiān)聽
EventEmitter.removeAllListeners([eventName])
- eventName {any}
移除全部或指定 eventName 的監(jiān)聽器。
注意,在代碼中移除其他地方添加的監(jiān)聽器是一個(gè)不好的做法,尤其是當(dāng) EventEmitter 實(shí)例是其他組件或模塊創(chuàng)建的。
返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
EventEmitter.removeListener(eventName, listener)(有bug)
- eventName {any}
- listener {Function}
從名為 eventName 的事件的監(jiān)聽器數(shù)組中移除指定的 listener。
const callback = (stream) => {console.log('有連接!'); }; server.on('connection', callback); // ... server.removeListener('connection', callback);removeListener 最多只會(huì)從監(jiān)聽器數(shù)組里移除一個(gè)監(jiān)聽器實(shí)例。 如果任何單一的監(jiān)聽器被多次添加到指定 eventName 的監(jiān)聽器數(shù)組中,則必須多次調(diào)用 removeListener 才能移除每個(gè)實(shí)例。
注意,一旦一個(gè)事件被觸發(fā),所有綁定到它的監(jiān)聽器都會(huì)按順序依次觸發(fā)。 這意味著,在事件觸發(fā)后、最后一個(gè)監(jiān)聽器完成執(zhí)行前,任何 removeListener() 或 removeAllListeners() 調(diào)用都不會(huì)從 emit() 中移除它們。 隨后的事件會(huì)像預(yù)期的那樣發(fā)生。
const myEmitter = events.emitter();const callbackA = () => {console.log('A');myEmitter.removeListener('event', callbackB); };const callbackB = () => {console.log('B'); };myEmitter.on('event', callbackA);myEmitter.on('event', callbackB);// callbackA 移除了監(jiān)聽器 callbackB,但它依然會(huì)被調(diào)用。 // 觸發(fā)是內(nèi)部的監(jiān)聽器數(shù)組為 [callbackA, callbackB] myEmitter.emit('event'); // 打印: // A // B// callbackB 被移除了。 // 內(nèi)部監(jiān)聽器數(shù)組為 [callbackA] myEmitter.emit('event'); // 打印: // A因?yàn)楸O(jiān)聽器是使用內(nèi)部數(shù)組進(jìn)行管理的,所以調(diào)用它會(huì)改變?cè)诒O(jiān)聽器被移除后注冊(cè)的任何監(jiān)聽器的位置索引。
雖然這不會(huì)影響監(jiān)聽器的調(diào)用順序,但意味著由 emitter.listeners() 方法返回的監(jiān)聽器數(shù)組副本需要被重新創(chuàng)建。
返回一個(gè) EventEmitter 引用,可以鏈?zhǔn)秸{(diào)用。
19、腳本間廣播通信
腳本間通信除了使用engines模塊提供的ScriptEngine.emit()方法以外,也可以使用events模塊提供的broadcast廣播。
events.broadcast本身是一個(gè)EventEmitter,但它的事件是在腳本間共享的,所有腳本都能發(fā)送和監(jiān)聽這些事件;事件處理會(huì)在腳本主線程執(zhí)行
例如在一個(gè)腳本發(fā)送一個(gè)廣播hello:
events.broadcast.emit("hello", "小明");在其他腳本中監(jiān)聽并處理:
events.broadcast.on("hello", function(name){toast("你好, " + name); }); //保持腳本運(yùn)行 setInterval(()=>{}, 1000);20、獲取window窗口信息
auto.windows
獲取當(dāng)前窗口的集合
auto.windows.filter(w => {//條件})21、Autojs 8.0Pro版本:監(jiān)聽無障礙事件的API
在以前,Auto.js也一直只能通過無限循環(huán)去判斷當(dāng)前界面、尋找控件,這實(shí)際上對(duì)省電優(yōu)化十分不友好。
在Pro 8.0.0-3版本,引入了監(jiān)聽無障礙事件的API。
auto.registerEvents(events)
- events {Array} 要監(jiān)聽的事件數(shù)組
- 返回 {EventEmitter}
auto.registerEvent(event, callback)
- event {String} 要監(jiān)聽的事件
- callback {Function} 事件回調(diào)
- 返回 {EventEmitter}
以上兩個(gè)函數(shù)用于監(jiān)聽一個(gè)或多個(gè)無障礙事件。所謂無障礙事件,即(其他軟件)窗口發(fā)送變化、控件發(fā)送變化時(shí)的事件,包括:
- view_clicked 控件被點(diǎn)擊
- view_long_clicked 控件被長(zhǎng)按點(diǎn)擊
- view_selected 控件被選中
- view_focused 控件成為焦點(diǎn)
- view_text_changed 控件文本改變
- view_scrolled 控件被滑動(dòng)
- window_state_changed 窗口狀態(tài)變化
- window_content_changed 窗口內(nèi)容變化
- window_changed 屏幕上顯示窗口的變化(增加,刪除,子窗口變化等)
- notification_state_changed 通知狀態(tài)變化
例如,我們要監(jiān)聽Auto.js的打開,可以用以下代碼監(jiān)聽:
// 監(jiān)聽窗口變化 auto.registerEvent('windows_changed', e => {// 判斷是否有新窗口打開if (e.windowChanges[0].indexOf('add') >= 0) {// 獲取新窗口的idlet wid = e.windowId;// 遍歷窗口,獲取新窗口let window = auto.windows.filter(w => w.id == wid);// 判斷新窗口是Auto.jsif (window.length >= 0 && window[0].title == 'Auto.js') {toast("Auto.js被打開了!");}} });22、監(jiān)聽無障礙事件的API:控件被點(diǎn)擊
// 監(jiān)聽控件被點(diǎn)擊:view_clicked、view_long_clicked auto.registerEvent('view_clicked', e => {log(e)});文件系統(tǒng) - Files
一次性的文件讀寫可以直接使用files.read(), files.write(), files.append()等方便的函數(shù)
但如果需要頻繁讀寫或隨機(jī)讀寫,則使用open()函數(shù)打開一個(gè)文件對(duì)象來操作文件,并在操作完畢后調(diào)用close()函數(shù)關(guān)閉文件。
files.isFile(path)
- path {string} 路徑
- 返回 {boolean}
返回路徑path是否是文件。
log(files.isDir("/sdcard/文件夾/")); //返回false log(files.isDir("/sdcard/文件.txt")); //返回truefiles.isDir(path)
- path {string} 路徑
- 返回 {boolean}
返回路徑path是否是文件夾。
log(files.isDir("/sdcard/文件夾/")); //返回true log(files.isDir("/sdcard/文件.txt")); //返回falsefiles.isEmptyDir(path)
- path {string} 路徑
- 返回 {boolean}
返回文件夾path是否為空文件夾。如果該路徑并非文件夾,則直接返回false。
files.join(parent, child)
- parent {string} 父目錄路徑
- child {string} 子路徑
- 返回 {string}
連接兩個(gè)路徑并返回,例如files.join("/sdcard/", "1.txt")返回"/sdcard/1.txt"。
files.create(path)
- path {string} 路徑
- 返回 {boolean}
創(chuàng)建一個(gè)文件或文件夾并返回是否創(chuàng)建成功。如果文件已經(jīng)存在,則直接返回false。
files.create("/sdcard/新文件夾/");files.createWithDirs(path)
- path {string} 路徑
- 返回 {boolean}
創(chuàng)建一個(gè)文件或文件夾并返回是否創(chuàng)建成功。如果文件所在文件夾不存在,則先創(chuàng)建他所在的一系列文件夾。如果文件已經(jīng)存在,則直接返回false。
files.createWithDirs("/sdcard/新文件夾/新文件夾/新文件夾/1.txt");files.exists(path)
- path {string} 路徑
- 返回 {boolean}
返回在路徑path處的文件是否存在。
files.ensureDir(path)
- path {string} 路徑
確保路徑path所在的文件夾存在。如果該路徑所在文件夾不存在,則創(chuàng)建該文件夾。
例如對(duì)于路徑"/sdcard/Download/ABC/1.txt",如果/Download/文件夾不存在,則會(huì)先創(chuàng)建Download,再創(chuàng)建ABC文件夾。
files.read(path[, encoding = “utf-8”])
- path {string} 路徑
- encoding {string} 字符編碼,可選,默認(rèn)為utf-8
- 返回 {string}
讀取文本文件path的所有內(nèi)容并返回。如果文件不存在,則拋出FileNotFoundException。
log(files.read("/sdcard/1.txt"));files.readBytes(path)
- path {string} 路徑
- 返回 {byte[]}
讀取文件path的所有內(nèi)容并返回一個(gè)字節(jié)數(shù)組。如果文件不存在,則拋出FileNotFoundException。
注意,該數(shù)組是Java的數(shù)組,不具有JavaScript數(shù)組的forEach, slice等函數(shù)。
一個(gè)以16進(jìn)制形式打印文件的例子如下:
var data = files.readBytes("/sdcard/1.png"); var sb = new java.lang.StringBuilder(); for(var i = 0; i < data.length; i++){sb.append(data[i].toString(16)); } log(sb.toString());files.write(path, text[, encoding = “utf-8”])
- path {string} 路徑
- text {string} 要寫入的文本內(nèi)容
- encoding {string} 字符編碼
把text寫入到文件path中。如果文件存在則覆蓋,不存在則創(chuàng)建。
var text = "文件內(nèi)容"; //寫入文件 files.write("/sdcard/1.txt", text); //用其他應(yīng)用查看文件 app.viewFile("/sdcard/1.txt");files.writeBytes(path, bytes)
- path {string} 路徑
- bytes {byte[]} 字節(jié)數(shù)組,要寫入的二進(jìn)制數(shù)據(jù)
把bytes寫入到文件path中。如果文件存在則覆蓋,不存在則創(chuàng)建。
files.append(path, text[, encoding = ‘utf-8’])
- path {string} 路徑
- text {string} 要寫入的文本內(nèi)容
- encoding {string} 字符編碼
把text追加到文件path的末尾。如果文件不存在則創(chuàng)建。
var text = "追加的文件內(nèi)容"; files.append("/sdcard/1.txt", text); files.append("/sdcard/1.txt", text); //用其他應(yīng)用查看文件 app.viewFile("/sdcard/1.txt");files.appendBytes(path, text[, encoding = ‘utf-8’])
- path {string} 路徑
- bytes {byte[]} 字節(jié)數(shù)組,要寫入的二進(jìn)制數(shù)據(jù)
把bytes追加到文件path的末尾。如果文件不存在則創(chuàng)建。
files.copy(fromPath, toPath)
- fromPath {string} 要復(fù)制的原文件路徑
- toPath {string} 復(fù)制到的文件路徑
- 返回 {boolean}
復(fù)制文件,返回是否復(fù)制成功。例如files.copy("/sdcard/1.txt", "/sdcard/Download/1.txt")。
files.move(fromPath, toPath)
- fromPath {string} 要移動(dòng)的原文件路徑
- toPath {string} 移動(dòng)到的文件路徑
- 返回 {boolean}
移動(dòng)文件,返回是否移動(dòng)成功。例如files.move("/sdcard/1.txt", "/sdcard/Download/1.txt")會(huì)把1.txt文件從sd卡根目錄移動(dòng)到Download文件夾。
files.rename(path, newName)
- path {string} 要重命名的原文件路徑
- newName {string} 要重命名的新文件名
- 返回 {boolean}
重命名文件,并返回是否重命名成功。例如files.rename("/sdcard/1.txt", "2.txt")。
files.renameWithoutExtension(path, newName)
- path {string} 要重命名的原文件路徑
- newName {string} 要重命名的新文件名
- 返回 {boolean}
重命名文件,不包含拓展名,并返回是否重命名成功。例如files.rename("/sdcard/1.txt", "2")會(huì)把"1.txt"重命名為"2.txt"。
files.getName(path)
- path {string} 路徑
- 返回 {string}
返回文件的文件名。例如files.getName("/sdcard/1.txt")返回"1.txt"。
files.getNameWithoutExtension(path)
- path {string} 路徑
- 返回 {string}
返回不含拓展名的文件的文件名。例如files.getName("/sdcard/1.txt")返回"1"。
files.getExtension(path)
- path {string} 路徑
- 返回 {string}
返回文件的拓展名。例如files.getExtension("/sdcard/1.txt")返回"txt"。
files.remove(path)
- path {string} 路徑
- 返回 {boolean}
刪除文件或空文件夾,返回是否刪除成功。
files.removeDir(path)
- path {string} 路徑
- path {string} 路徑
- 返回 {boolean}
刪除文件夾,如果文件夾不為空,則刪除該文件夾的所有內(nèi)容再刪除該文件夾,返回是否全部刪除成功。
files.getSdcardPath()
- 返回 {string}
返回SD卡路徑。所謂SD卡,即外部存儲(chǔ)器。
files.cwd()
- 返回 {string}
返回腳本的"當(dāng)前工作文件夾路徑"。該路徑指的是,如果腳本本身為腳本文件,則返回這個(gè)腳本文件所在目錄;否則返回null獲取其他設(shè)定路徑。
例如,對(duì)于腳本文件"/sdcard/腳本/1.js"運(yùn)行files.cwd()返回"/sdcard/腳本/"。
files.path(relativePath)
- relativePath {string} 相對(duì)路徑
- 返回 {string}
返回相對(duì)路徑對(duì)應(yīng)的絕對(duì)路徑。例如files.path("./1.png"),如果運(yùn)行這個(gè)語句的腳本位于文件夾"/sdcard/腳本/"中,則返回"/sdcard/腳本/1.png"。
files.listDir(path[, filter])
- path {string} 路徑
- filter {Function} 過濾函數(shù),可選。接收一個(gè)string參數(shù)(文件名),返回一個(gè)boolean值。
列出文件夾path下的滿足條件的文件和文件夾的名稱的數(shù)組。如果不加filter參數(shù),則返回所有文件和文件夾。
列出sdcard目錄下所有文件和文件夾為:
var arr = files.listDir("/sdcard/"); log(arr);列出腳本目錄下所有js腳本文件為:
var dir = "/sdcard/腳本/"; var jsFiles = files.listDir(dir, function(name){return name.endsWith(".js") && files.isFile(files.join(dir, name)); }); log(jsFiles); 是否是文件 是否是文件夾 是否是空的文件夾 合并路徑 創(chuàng)建文件夾 創(chuàng)建一系列文件夾 文件是否存在 確保文件夾存在 讀取文件 讀取文件字節(jié)集 寫到文件 以字節(jié)集寫到文件 添加文本到文件末尾 添加字節(jié)集到文件末尾 復(fù)制 移動(dòng) 重命名 文件拓展名 刪除 路徑 文件列表總結(jié)
以上是生活随笔為你收集整理的autojs的使用文档的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centOS7安装redis单例配置主从
- 下一篇: QuickCHM V2.6