在手機的設(shè)置界面凄敢,有一個叫輔助功能的設(shè)置韧衣,點擊進去可以看到已安裝的輔助服務(wù)极颓,點擊具體的服務(wù)進去可以看到該服務(wù)的一些描述朱盐,可以在此開啟該服務(wù),這也是唯一一個能開啟服務(wù)的地方菠隆。
輔助功能介紹
開啟輔助功能相當(dāng)于開啟了一個服務(wù)兵琳,在手機界面改變的時候,就能監(jiān)聽到該頁面的一些信息并且能拿到界面的一些控件骇径,然后可以對控件進行模擬點擊躯肌,從而實現(xiàn)我們想要的功能。
除此以外破衔,不僅能夠?qū)Λ@取到的控件進行模擬點擊清女,在Android7.0及以上的版本,我們可以模擬任意位置的點擊包括觸摸晰筛、滑動等等嫡丙,就是說我們可以實現(xiàn)任何人能夠進行的操作,這個是很有用的读第,可以做出很多有意思的東西迄沫,如果再配上截圖、錄屏和圖像識別卦方,就更有意思了羊瘩。
模擬點擊,就是說我們的手機界面自己動盼砍,整個流程像是一只手在幫你操作一樣的尘吗;
實現(xiàn)
新建一個Service繼承AccessibilityService
public class LuckMoneyService extends AccessibilityService
然后去AndroidManifest文件里面去注冊一下這個Service
<service
android:name=".service.LuckMoneyService"
android:label="小圓臉的紅包助手"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessible_service_wx_config" />
</service>
在meta-data
節(jié)點下有個resource
值,這是個xml文件浇坐,里面配置了該輔助的一些信息睬捶,在res目錄下新建一個文件夾,名字叫xml近刘,然后新建一個xml文件擒贸,名字和resource
配置的一樣就行了
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged|typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestFilterKeyEvents="true"
android:description="@string/wx_luck_money"
android:canRequestEnhancedWebAccessibility="true"
android:notificationTimeout="20"
android:packageNames="com.tencent.mm"
android:canPerformGestures="true" />
里面配置了一些參數(shù),比如notificationTimeout
是指定多少毫秒監(jiān)聽一次界面變化的觉渴,packageNames
是指定監(jiān)聽哪個應(yīng)用的介劫,刪掉這個配置就是監(jiān)聽全局,description
是對于該輔助的描述案淋,其他配置不管也罷座韵。
然后在LuckMoneyService里面重寫一下onAccessibilityEvent方法
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//界面發(fā)生了變化
}
每當(dāng)界面改變的時候就會回調(diào)這個方法,通過event
我們就可以獲取到界面的信息包括界面上的控件
簡單的用法
//獲取當(dāng)前界面包名
String packageName = event.getPackageName().toString();
//獲取當(dāng)前類名
String className = event.getClassName().toString();
//獲取當(dāng)前界面父布局的控件
AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();
//在父布局里面根據(jù)子控件**顯示的文字**找到該子控件
List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByText(text);
//在父布局里面根據(jù)子控件的**id**找到該子控件
List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id);
//點擊該控件
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
上面的操作都比較基礎(chǔ),根據(jù)控件顯示的文字查找控件誉碴,找出來的肯定是TextView和Button了宦棺,根據(jù)ID查找控件,ID就是指的寫布局文件的時候設(shè)置的控件的ID
模擬觸摸
模擬觸摸就是可以模擬人的觸摸動作黔帕,也比較簡單
protected void gestureOnScreen(Path path, long startTime, long duration,
AccessibilityService.GestureResultCallback callback) {
GestureDescription.Builder builde = new GestureDescription.Builder();
builde.addStroke(new GestureDescription.StrokeDescription(path, startTime, duration));
GestureDescription gestureDescription = builde.build();
dispatchGesture(gestureDescription, callback, null);
}
可以看到需要傳入path
就是一個路徑嘛代咸,模擬滑動的路徑,用canvas畫過畫的都知道這東西還是比較簡單的成黄,startTime
就是多久后開始模擬事件侣背,duration
就是該滑動的時間,其他回調(diào)什么的為空就可以了慨默;
Monitor
如何獲取控件的ID呢贩耐,而我又是如何知道界面上有哪些控件呢,可以通過一個工具來實現(xiàn)厦取,就是在sdk工具下面的一個叫monitor的工具潮太,其實之前的AndroidStudio是帶這個工具的,但是后來界面上是沒有了虾攻,但是其實還在的
/Users/Tyhj/Library/Android/sdk/tools/monitor
連上手機铡买,打開這個工具,手機上打開你要查看的界面霎箍,點擊工具手機的小手機的圖標(biāo)奇钞,就會截屏,顯示出這個界面的信息
最后
輔助功能能做的東西大概就上面這些了漂坏,能做出什么功能就靠自己的想象了
推薦閱讀:Android微信搶紅包輔助