轉載請注明出處:http://www.itdecent.cn/p/19ddd41aa349
最近才剛開始用簡書來寫博客,富文本編輯器用的太不習慣了,文本格式大家多包含吧!后面會改用Markdown編輯器。同時在編碼的過程中,參考了lendylongli關于搶紅包的算法,感興趣的同學可以去看一下:https://github.com/lendylongli/qianghongbao。
又到年末,公司微信群里各種紅包飛。對于我等手慢黨來說,如果有一個能在第一時間打開紅包的輔助程序,那將是最大的福音。雖然第一個搶到的人,并不一定能搶到最大的紅包。但是,本著”生死看淡,不服就干“的原則,let's do something!
一、前期準備
這里主要用到兩個類:NotificationListenerService和AccessibilityService。還有一個工具:uiautomatorviewer。
NotificationListenerService
從API 18開始,用來監(jiān)聽過濾通知欄中的信息。當微信處于后臺,或者當前界面處于聊天列表的時候,有新消息到來的時候,微信會已Notification的形式彈出。這里我們要監(jiān)聽微信彈出的Notification,并從中過濾出是“微信紅包”的信息。如果是微信紅包,那么就自動點開這條消息,并把紅包打開。
AccessibilityService
搶紅包主要用到的就是這個類。用來監(jiān)聽界面變化,并執(zhí)行本應該由用戶來執(zhí)行的操作,比如點開聊天消息,打開紅包等。AccessibilityService,本是Android對于那些由于視力、聽力或其它身體原因導致不能方便使用Android智能手機的用戶,提供的幫助這些用戶更加簡單地操作設備,包括文字轉語音(不支持中文)、觸覺反饋、手勢操作、軌跡球和手柄操作的一個工具。只不過,咱們都用來做了一些更方便的事情。
uiautomatorviewer
這是Android SDK下的一個工具。用來掃描和分析 Android 設備上當前顯示的 UI 組件。使用此工具檢查布局層次結構,并查看在設備前臺顯示的 UI 組件屬性。主要用來在編寫自動化測試代碼的時候,定位目標控件。
二、思路
先來看下手動搶紅包的流程:①從聊天列表中點擊進入聊天詳情,然后點擊微信紅包的消息,彈出一個紅包的dialog,最后點擊dialog中間的“開”完成搶紅包;②當微信在后臺時,有紅包消息通知Notification彈出,點擊通知,進入聊天詳情,然后和上一種方式一樣。
再來說下紅包助手的大致思路:開啟一個AccessibilityService來監(jiān)聽手機界面的變化。如果有微信紅包,就用AccessibilityService模擬手動搶紅包的流程去完成搶紅包。如果微信彈出的Notification消息是一條“微信紅包”的消息,那么去點擊這個Notification,然后和上面一樣,模擬點擊,完成搶紅包的整個過程。
三、動手開干
1、先寫一個主界面,用來引導用戶初始化一些Service的一些操作,以及統(tǒng)計一下幫助用戶搶到的紅包數(shù)量。直接上圖
2、配置我們的AccessibilityService。主要分為3步:
①繼承AccessibilityService,并重寫onAccessibilityEvent方法。當服務啟動后,手機界面發(fā)上變化就會回調這個方法。然后我們根據(jù)新界面中的內容來判斷是否有微信紅包,如果有的話就去模擬點擊,去搶紅包。代碼有些多,但都注釋的很清楚。
②在res下新建一個xml文件夾,然后新建一個名為luckymoney_service_config.xml的文件,加上下面的代碼

這里主要的幾個參數(shù):
accessibilityEventTypes是配置響應哪些操作包括單擊、長按、滑動等,這里是響應全部類型的事件。
accessibilityFeedbackType是反饋給用戶的方式,比如語音和震動等。
notificationTimeout是相同類型的兩個事件之間的最小時間發(fā)送到該服務。
packageNames是響應的程序的包名,這里響應微信和QQ。
③在AndroidManifest中配置這個Service。下面的meta-data要指定上一步中定義的配置文件

3、配置NotificationService
①繼承NotificationListenerService,并實現(xiàn)onNotificationPosted和onNotificationRemoved這個方法;
②在AndroidManifest中配置這個Service

4、至此基本配置就已經完成了。下面開始監(jiān)聽微信紅包,并搶紅包。下面說一下從微信聊天列表中篩選出有紅包的聊天,以及聊天詳情中識別微信消息中有微信紅包,并打開紅包的核心代碼。完整版代碼,可以從文末鏈接下載。
下面以聊天列表、聊天詳情中點擊紅包消息,并在彈出的dialog上拆開紅包為例:
1、打開SDK→tools→uiautomatorviewer,去解析當前手機界面的布局。下面這個是點擊拆紅包的button,可以獲取id,后面就可以通過這個id來查找到這個button,并執(zhí)行點擊操作。

2、手機界面發(fā)生變化,比如收到一條紅包消息。那么AccessibilityService的onAccessibilityEvent會被回調,并傳入一個AccessibilityEvent對象。通過這個對象中獲取當前手機屏幕的信息。通過event.getClassName()獲取當前界面的類名,通過比對微信紅包界面的類名來確定當前進行到了搶紅包的第幾步,然后去執(zhí)行相應的操作。微信紅包相關的類名如下:
? ? ? ? ? "com.tencent.mm.ui.LauncherUI"是最近聯(lián)系人列表和聊天詳情。當出現(xiàn)這個的時候,我們去判斷是否有紅包。
? ? ? ? ? "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI"是點擊了紅包消息,彈出了dialog,等待用戶點擊“開”的界面。
? ? ? ? ? "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI"是拆完紅包后的界面。
這些類名在筆者當前6.5.4版本的微信上是這樣的。如果后期微信新版做出了更換,大家可以通過查看手機堆棧頂層的類名來重新獲取。
3、在最近聯(lián)系人列表和聊天詳情中查找紅包的代碼

4、點擊彈出待拆的紅包dialog,去執(zhí)行拆開的代碼。這段代碼有點多,而且微信不同版本下,拆開紅包的按鈕也不一樣。這里大家可以去源碼中查看,注釋的很清楚。老版本中是“拆紅包”的文字,新版本是Button圖片。這里從百度上找到一張圖片,引用一下,十分感謝。

總結
其實,學會了AccessibilityService的用法,可以讓手機為你做更多的事情。比如筆者也寫了一個支付寶自動掃福字的程序,雖然后來支付寶限定了每天只能掃出一張福,自動掃也沒什么軟用。后期我會分享更多自己的東西,希望大家喜歡,有不足之處,敬請指出。