日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android拆轮子系列之一步一步教你写微信抢红包插件

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android拆轮子系列之一步一步教你写微信抢红包插件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一章《AccessibilityService講解》我們對AccessibilityService做了基本的講解,本章我們就利用AccessibilityService做一個搶紅包插件。

1.前言

本章編寫的代碼僅供個人學習使用,禁止用于其他非法行為。技術是把雙刃劍希望大家正確對待!

在文章的開頭奉送上代碼,方便大家對照著學習。

2.代碼編寫

2.1搶包流程:

做搶紅包的插件我們得一步一步來,首先我們應該了解搶紅包的流程是怎么樣的,回顧一下搶紅包的流程:

1. 狀態欄出現”[微信紅包]”的消息提示,點擊進入聊天界面 2. 點擊相應的紅包信息,彈出搶紅包界面 3. 在搶紅包界面點擊”開”,打開紅包 4. 在紅包詳情頁面,查看詳情,點擊返回按鈕返回微信聊天界面.

上面就是搶紅包的整個流程。雖然這是整個流程,但是當前微信處于的界面可能出現以下幾種:

1.微信在后臺運行,而當前手機在瀏覽其他APP(需要執行1->2->3->4) 2.當前處于微信的首頁(需要執行1->2->3->4) 3.處于和某個人聊天的頁面(2->3->4)

2.1代碼編寫

理解了搶紅包的流程,我們開始編寫代碼。上一節講了,創建一個AccessibilityService的流程很簡單如下:
1.繼承AccessibilityService類,重寫里面的方法
2.在AndroidMainifest中注冊
3.添加配置文件

1.下面我們來看一下AccessibilityService的編寫

package com.czh.service; import java.util.ArrayList; import java.util.List; import android.accessibilityservice.AccessibilityService; import android.app.Notification; import android.app.PendingIntent; import android.content.Intent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast;/*** @author 作者 YYD* @version 創建時間:2016年12月14日 下午2:46:49* @function 未添加*/ public class RobService extends AccessibilityService {/*** 此方法用來接收我的需要的各種事件 在accessibility.xml中我們監聽了以下事件:* typeNotificationStateChanged typeWindowStateChanged* typeWindowContentChanged* http://www.jianshu.com/p/ba298b8d5a6e 看看這個是否被拆了判斷*/@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {int eventType = event.getEventType();switch (eventType) {// 當通知欄發生改變的時候case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:List<CharSequence> texts = event.getText();if (!texts.isEmpty()) {for (CharSequence text : texts) {String content = text.toString();if (content.contains("[微信紅包]")) {if ((event.getParcelableData() != null)&& (event.getParcelableData() instanceof Notification)) {Notification notification = (Notification) event.getParcelableData();PendingIntent pendingIntent = notification.contentIntent;try {pendingIntent.send();} catch (Exception e) {}}}}}break;// 當窗口內容發生改變的時候case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:break;// 當窗口狀態發生改變的時候case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:String className = event.getClassName().toString();if (className.equals("com.tencent.mm.ui.LauncherUI")) { //聊天頁 // getLastPacket();//注釋的原因我在方法中寫明了,如果放開這個方法就會出現死循環,大家可以嘗試一下。 // inputClick("com.tencent.mm:id/fz");//這條語句是聊天頁面返回鍵的id,放不放開都沒用。} else if (className //拆紅包頁,點擊“開”,搶紅包.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI")) {inputClick("com.tencent.mm:id/bg7");} else if (className //紅包詳情頁,點擊返回鍵.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI")) {inputClick("com.tencent.mm:id/gd");}break;}}/*** 根據id,獲取AccessibilityNodeInfo,并點擊。*/private void inputClick(String clickId) {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo != null) {List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId(clickId);for (AccessibilityNodeInfo item : list) {item.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}} /*** 這個方法有缺陷。要是能加 過濾已拆紅包就好了。我實在想不出好的辦法所以注釋掉了。* 如果大家有好的過濾方案,請告訴我一聲,不勝感激!這是我的一個遺憾* 因為這一行注釋掉,就不是我們想要的全自動的搶紅包了。*/private void getLastPacket() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();recycle(nodeInfo);if (parents.size() > 0) {parents.get(parents.size() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK);}}@Overridepublic void onInterrupt() {}@Overrideprotected void onServiceConnected() {super.onServiceConnected();Toast.makeText(RobService.this, "成功與微信綁定,開始監聽", Toast.LENGTH_SHORT).show();}ArrayList<AccessibilityNodeInfo> parents = new ArrayList<AccessibilityNodeInfo>(); /*** 這個方法是用遞歸的方式,遍歷節點樹。* 如果找到“領取紅包”和“查看紅包”所在葉子節點,就用while不斷的找自己父節點,這個父節點要求可以被點擊。(也是是說找最近一個可以點擊的父節點)*/private void recycle(AccessibilityNodeInfo info) {if (info.getChildCount() == 0) {if (info.getText() != null) {if ("領取紅包".equals(info.getText().toString())||"查看紅包".equals(info.getText().toString())) { // if (info.isClickable()) { // info.performAction(AccessibilityNodeInfo.ACTION_CLICK); // }AccessibilityNodeInfo parent = info.getParent();while (parent != null) {if (parent.isClickable()) {parents.add(parent);//找到了添加到列表并推出循環,否則繼續往上找父節點。break;}parent = parent.getParent();}}}} else {for (int i = 0; i < info.getChildCount(); i++) {if (info.getChild(i) != null) {recycle(info.getChild(i));}}}}@Overridepublic boolean onUnbind(Intent intent) {Toast.makeText(this, "斷開與微信綁定,停止監聽", Toast.LENGTH_SHORT).show();return super.onUnbind(intent);} }

這里我們對一些語句做一些解釋:

1.getRootInActiveWindow(); //獲取當前窗口的根節點。 2.findAccessibilityNodeInfosByViewId//根據id獲取節點,獲取的是一個列表 3.AccessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);//模擬點擊事件 4.AccessibilityNodeInfo.getParent()獲取父節點

2.MainActivity類的編寫

public class MainActivity extends Activity implements OnClickListener{private Button settingBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findView();}private void findView(){settingBtn = (Button) findViewById(R.id.settingBtn);settingBtn.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.settingBtn://跳轉到輔助設置頁Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);startActivity(intent);break;}} }

3.看一下menifest中的注冊

<service android:name="com.czh.service.RobService"android:enabled="true"android:exported="true"android:label="@string/servicelable"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/accessibility" /></service>

這里對menifest講解一下:

android:label="@string/servicelable"是服務描述

效果如下:

<serviceandroid:name="com.czh.service.RobService"android:enabled="true"android:exported="true"android:label="@string/servicelable"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" ><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter></service>

這一塊是固定的寫法,沒什么好說的。注意權限是必須要加上!

<meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility" />

meta-data是配置文件,配置信息在accessibility.xml中

3.看一下accessibility.xml文件
在res文件夾下面新建一個文件夾xml –> 在xml文件夾中新建一個accessibility.xml文件。

<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagDefault"android:canRetrieveWindowContent="true"android:notificationTimeout="100"android:description="@string/description"android:packageNames="com.tencent.mm" />

對這個accessibility.xml講解一下:

1.android:accessibilityEventTypes 表示監聽的事件類型,這本章中我們監聽通知,屏幕狀態變化,屏幕內容變化。typeAllMask表示監聽所有類型 2.android:accessibilityFeedbackType 表示手機用什么方式將信息反饋給用戶,語音震動等等,這里默認; 3.android:canRetrieveWindowContent="true",允許檢索窗口內容,這一條必須要加上。 4.android:description 描述 5.android:packageNames="com.tencent.mm"這里我們監聽微信的包名,如果你想監聽多個App的話可以這樣寫: android:packageNames="com.tencent.mm|com.tencent.qq"

在配置文件中android:description添加后的效果圖是這樣的:

3.看一下strings.xml文件

<?xml version="1.0" encoding="utf-8"?> <resources><string name="app_name">微信搶紅包</string><string name="servicelable">微信自動搶紅包</string><string name="description">本插件僅供娛樂,切勿用于不當用途,出現問題后果自負!</string> </resources>

3.補充

大家可能在想,findAccessibilityNodeInfosByViewId()方法中的ID是如何知道的呢?下面我們就來解釋一下:
在devices中有這么一個按鈕,點擊進入,效果圖如下:

進入之后你會看到下面界面:

通過圖你可以看出,左面是界面,又面是布局和控件的詳細信息(我們可以通過這個來學習人家的布局規律),當你點擊某個控件的時候,右面就會顯示該控件的信息,圖中我們標記出來了。

4.不足之處

我在寫這個東西上時候有一個bug,一直不知道如何解決:新版微信無法區分未拆紅包和已拆紅包。就是因為這個原因程序會把已拆紅包當成未拆紅包來拆,導致死循環,如果有知道解決方案的朋友請告知我,不勝感激!

5.結尾

在文章的結尾奉送上代碼,方便大家對照著學習。

在技術上我依舊是個小渣渣,加油勉勵自己。

總結

以上是生活随笔為你收集整理的android拆轮子系列之一步一步教你写微信抢红包插件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。