Auto.js进行自动化熄灭屏幕操作(超简单版本)
????????最近在寫腳本的時候,發現定時腳本會發生auto.js在后臺運行,導致手機無法自動熄屏的問題(畢竟大家寫定時腳本都是為了方便,比如在不需要使用手機的時候完成一些重復性操作...)。但是我們又不能直接停止運行auto.js,那你第一個腳本爽完了,其他的腳本兄弟咋辦。
????????眾所周知,“用安卓手機的男人都是好男人,因為每天晚上都要回家充電”(bushi)。安卓手機的電量可是很寶貴的,所以為了解決這個問題。我就去網上查閱了一些資料,發現大部分自動熄屏操作在不對手機進行root的前提下都非常繁瑣。可是大家寫腳本不就是為了偷懶嘛,這么麻煩的操作有違初衷啊。
????????機智的我想到了一個以前上課偷摸玩手機時候喜歡用的一個小部件——“一鍵鎖屏”,用最簡單的方式實現這一功能。
開始嘗試
? ? ? ? 首先,我在華為手機上進行了測試。發現只要“一鍵鎖屏”這個小部件,位于桌面的第一層,那么Auto.js就可以直接通過text,識別出這個小部件,并且進行點擊。
? ? ? ? 因此,我們只需要在腳本運行結束后,使用home()返回桌面,便可以直接實現 “腳本結束,對手機屏幕進行熄屏” 的操作。
? ? ? ? 需要注意的是,以下方法的實現,都需要將“一鍵鎖屏”小部件放置在手機桌面的第一層,不能將其擺放至文件夾收納起來。
? ? ? ? 有趣的是,在這臺華為手機上進行測試的時候。不管屏幕內是否存在“一鍵鎖屏”小部件,auto.js都可以對“一鍵鎖屏”的文本進行識別點擊,達到熄屏的效果,可以說是非常方便給力了。下面是多次測試成功的代碼:
/*** 結束腳本后,是否需要一鍵鎖屏* 請填入"yes"或"no"(默認為"yes")* 此功能需要在手機桌面第一層放置“一鍵鎖屏”部件或應用*/ var need_lock = "yes";// 屏幕是否為鎖定狀態 function isDeviceLocked() {importClass(android.app.KeyguardManager);importClass(android.content.Context);var km = context.getSystemService(Context.KEYGUARD_SERVICE);return km.isKeyguardLocked(); }/*** 熄滅屏幕* 自動熄屏功能需要在手機桌面第一層放置“一鍵鎖屏”部件或應用*/ function lockScreen() {log("亮度模式:自動");log("取消設備常亮...");device.setBrightnessMode(1); // 自動亮度模式device.cancelKeepingAwake(); // 取消設備常亮// 震動一秒toast('腳本運行完畢!');device.vibrate(1000);sleep(1000);if (need_lock == "yes" && !isDeviceLocked()) {text("一鍵鎖屏").waitFor();click("一鍵鎖屏");sleep(1000);} }發現問題,進行優化
? ? ? ? 而正當我以為大功告成的時候,手賤用了另一臺vivo手機進行測試。哦吼,寄!
? ? ? ? 在這部vivo手機上,出現了一個問題——auto.js雖然可以識別到 “一鍵鎖屏” 的text文本,但卻無法對其進行點擊。
? ? ? ? 所以我們改變思路:既然這個控件我們無法正常對其點擊,那么我們是否可以利用坐標的形式對其進行操作呢?于是乎,優化版本的鎖屏函數便出現了:
? ? ? ? 在這個版本中,首先嘗試是否可以像之前的華為手機一樣,直接無視頁面識別出“一鍵鎖屏” 的text文本并進行點擊;如果識別到第一種鎖屏方案失敗了,屏幕仍未處于鎖屏狀態,就切換到第二種方案——
? ? ? ? 首先,判斷桌面上“一鍵鎖屏”的坐標。
????????之后,根據坐標的大小,判斷“一鍵鎖屏”是位于當前頁面的左側還是右側,并進行滑動操作。
????????最后,若“一鍵鎖屏”處于當前頁面,則直接根據坐標進行點擊操作,實現熄屏操作。
? ? ? ? 需要注意的是,?這里原本我使用的是識別出“一鍵鎖屏”的控件后,通過它的上下左右屬性隨機出一個點擊坐標進行點擊(畢竟是腳本操作,習慣性的想偏移坐標了)。但是我發現,如果使用控件內隨機坐標,會出現點擊失敗的情況,并且概率非常大。
????????又因為這里并不會有被識別腳本的風險,所以最后我沒有花精力去找合適的偏移坐標,而是直接使用了它的中心坐標。
? ? ? ? 我猜測,在vivo手機這里的點擊范圍僅限于它的圖標范圍,感興趣的同學可以用不同的手機去嘗試(雖然好像也沒什么很大的必要)。
/*** 熄滅屏幕* 自動熄屏功能需要在手機桌面第一層放置“一鍵鎖屏”部件或應用*/ function lockScreen() {log("亮度模式:自動");log("取消設備常亮...");device.setBrightnessMode(1); // 自動亮度模式device.cancelKeepingAwake(); // 取消設備常亮// 震動一秒toast('腳本運行完畢!');device.vibrate(1000);sleep(1000);if (need_lock == "yes" && !isDeviceLocked()) {text("一鍵鎖屏").waitFor();click("一鍵鎖屏");sleep(1000);if (!isDeviceLocked()) {log('快捷鎖屏失敗,切換方案...')// 獲取 “一鍵鎖屏” 小部件的坐標var lockBtn_X, lockBtn_Y;function get_btnxy() {text("一鍵鎖屏").waitFor();let lockBtn = text("一鍵鎖屏").findOne().bounds();lockBtn_X = (lockBtn.left + lockBtn.right) / 2;lockBtn_Y = (lockBtn.top + lockBtn.bottom) / 2;}get_btnxy();// 根據坐標判斷 “一鍵鎖屏” 小部件在當前頁面的左側還是右側while (lockBtn_X < 0 || lockBtn_X > device.width) {get_btnxy();if (lockBtn_X < 0) {swipe(device.width * 1 / 4, device.height * 5 / 6, device.width * 3 / 4, device.height * 5 / 6, 200);continue;}else if (lockBtn_X > device.width) {swipe(device.width * 3 / 4, device.height * 5 / 6, device.width * 1 / 4, device.height * 5 / 6, 200);continue;}}get_btnxy();click(lockBtn_X, lockBtn_Y);}} }一些思路
? ? ? ? 當然,我僅僅只是測試了兩部不同品牌的手機,更別說還要同品牌不同型號,或者更多不同品牌的手機。或許也會出現下面這些情況,我也給大家提供一些思路,拋磚引玉:
????????“一鍵鎖屏”不在當前頁面就無法識別 的情況:
????????可以直接把“一鍵鎖屏”放在主頁面,使用home()回到主頁面進行識別點擊;
????????亦或者,為函數加上一個page_num參數,代表桌面存在page_num張頁面。左滑動page_num次,右滑動page_num次。來回兩趟,對全部頁面遍歷進行識別。
? ? ? ? 手機沒有“一鍵鎖屏”小部件,或是不想在桌面放置“一鍵鎖屏”小部件:
? ? ? ? 我的解決思路還是一如既往的暴力(嘿嘿),如果是沒有“一鍵鎖屏”這個小部件 或者 為了美觀不想將其擺放在桌面第一層。我們可以直接從應用商店下載一個“一鍵鎖屏”的應用啊,直接使用別人打包好的功能不香嘛(狗頭)。
? ? ? ? 之后的思路就很清晰啦,腳本運行完畢后直接launchApp就可以了。
????????(也有可能是我想當然了,畢竟沒有實際進行過操作測試,僅僅只是提供一個思路哦)
????????我也是才接觸auto.js不久,希望這篇文章可以給大家提供一些思路或是幫助。
????????如果覺得這篇文章對你有幫助的話,希望可以點贊關注支持一下,也希望大家在評論區給我留言,互相交流學習(當然也可能是我單方面向大佬學習orz)。
總結
以上是生活随笔為你收集整理的Auto.js进行自动化熄灭屏幕操作(超简单版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s3c2450下AC97驱动研究
- 下一篇: OpenCV——计算轮廓长度/周长和面积