国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android微信搶紅包功能的實現原理淺析

2019-12-12 04:04:35
字體:
來源:轉載
供稿:網友

快到過農歷年了,微信紅包也越來越多了,出現了好多紅包外掛程序,就很好奇如何實現的,于是自己研究了一番,親自寫了個微信搶紅包的APP。現在就一步一步來實現它。

實現思路

微信搶紅包程序開啟時候,他就可以隨時識別、捕獲紅包,服務可以實現正在功能,當我們開啟服務的時候,服務就不停的在后臺運行,不停地輪詢著微信里面的消息,當發現紅包時候就立即打開微信紅包所在的界面。但是他怎識別紅包呢?需要找到微信搶紅包里面節點的view,當找到對應的view,在獲取view的關鍵字或者id,根據關鍵字或者id,自動的模擬點擊,拆開紅包。這里有一個AccessibilityService的服務,他是一個輔助類,可以實現這些功能。

AccessibilityService輔助類

AccessibilityService是一個輔助類,可以監聽我們手機的焦點,窗口變化,按鈕點擊,聲音提示等等,但是必須手動開啟,不能通過代碼開啟,存在于設置里面的輔助功能,開啟他我們可以增強互動性。現在來來使用他實現搶紅包功能:

1、新建一個類QiangHongBaoService繼承自AccessibilityService

@Override public void onAccessibilityEvent(AccessibilityEvent event) {   //獲取事件類型   int type = event.getEventType();   //在這里進行事件過濾    } 

2、注冊清單文件

<service   android:name=".QiangHongBaoService"   android:label="@string/app_name"   android:enabled="true"   android:exported="true"   android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">   <intent-filter android:priority="1000">     <action android:name="android.accessibilityservice.AccessibilityService"/>   </intent-filter>   <meta-data     android:name="android.accessibilityservice"     android:resource="@xml/envelope_service_config"/> </service> 

新建一個xml文件夾,創建envelope_service_config文件

<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"             android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"             android:accessibilityFeedbackType="feedbackGeneric"             android:accessibilityFlags="flagDefault"             android:canRetrieveWindowContent="true"             android:description="@string/accessibility_description"            android:notificationTimeout="100"           android:packageNames="com.tencent.mm" /> 記得加上網絡權限:<uses-permission Android:name="android.permission.VIBRATE" />

搶紅包業務邏輯處理

在微信搶紅包界面上只關心兩個事件類型:

1、AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED//監聽通知欄消息

在監聽通知欄消息界面主要是監聽每次微信發過來的消息顯示在通知欄時,獲取消息,當發現獲取的消息含有“微信紅包”時就會立即打開 紅包所顯示的界面。

/**  * 從知消息欄打開微信聊天界面  * @param event  */ private void openNotification(AccessibilityEvent event) {   if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {     Notification notification = (Notification) event.getParcelableData();     PendingIntent pendingIntent = notification.contentIntent;     try {       pendingIntent.send();     } catch (PendingIntent.CanceledException e) {       e.printStackTrace();     }   } } 

2、AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED//當前窗口變化,是否進入微信聊天界面

在這里需要根據包名判斷是否是聊天界面,如果是則點中紅包,如果不是判斷是否是拆紅包界面,如果是則拆開,執行拆紅包動作。

聊天界面的包名:com.tencent.mm.ui.LauncherUI

拆紅包界面的包名:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI

/**  * 點中紅包  */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void clickHongBao() {   AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();   if (nodeInfo == null) {     return;   }   List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(ENVLOP_OPEN_KEY);   if (list.isEmpty()) {     list = nodeInfo.findAccessibilityNodeInfosByText(ENVELOPE_TEXT_KEY);     for (AccessibilityNodeInfo n : list) {       n.performAction(AccessibilityNodeInfo.ACTION_CLICK);       break;     }   } else {     //最新的紅包領起     for (int i = list.size() - 1; i >= 0; i--) {       AccessibilityNodeInfo parent = list.get(i).getParent();       if (parent != null) {         parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);         break;       }     }   } } 
/**  *拆紅包  */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) private void openHongBao() {   AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow();   if (rootInActiveWindow == null) {     return;   }   List<AccessibilityNodeInfo> nodeInfos = rootInActiveWindow.findAccessibilityNodeInfosByViewId(ENVLOP_CHECKED_KEY);   for (AccessibilityNodeInfo nodeInfo : nodeInfos) {     nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);   } } 

上例中的拆紅包是依據控件的id拆開的,也可以按照關鍵字“拆紅包”執行。但是效率略低于根據id拆紅包,這樣很可能影響搶紅包的效率,需要注意的是拆紅包的id在微信不同版本中是不一樣的,所以需要經常改變,比較麻煩。此外當AccessibilityService服務被關閉時會回調onInterrupt方法,當連接上時會回調onServiceConnected方法,在這里可以做一些提示性的工作。

搶紅包功能的開啟

微信搶紅包功能是通過手動開啟的,直接在設置里面找到輔助功能,點擊開啟,為了方便,給activity設置一個按鈕,采用隱式意圖的方式,直接跳轉至服務功能。

//打開系統設置中輔助功能 Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivity(intent); 

到了這里微信搶紅包的而核心功能介紹完了,搶紅包的效率還受網絡,手機內存大小,系統流暢度的影響,以及服務優先級等等因素的影響。這里只是學習一下,千萬別用來經常外掛來搶紅包,小心被封號哦!!!
源碼已經上傳至github,需要的點擊打開鏈接

https://github.com/yoonerloop/WebEnvelope

以上所述是小編給大家介紹的Android微信搶紅包功能的實現原理淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渝中区| 惠东县| 嵩明县| 江山市| 龙里县| 芦山县| 新昌县| 宜章县| 木里| 奇台县| 无锡市| 济阳县| 衡阳县| 武功县| 禄丰县| 新田县| 怀集县| 芦溪县| 外汇| 鄄城县| 新绛县| 成都市| 汤原县| 澄迈县| 叶城县| 柳河县| 商城县| 张家界市| 福建省| 江油市| 信阳市| 新巴尔虎右旗| 侯马市| 金平| 土默特右旗| 天津市| 永福县| 保山市| 酉阳| 永济市| 汉阴县|