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

首頁 > 系統(tǒng) > Android > 正文

Android輔助功能AccessibilityService與搶紅包輔助

2020-04-11 10:49:45
字體:
供稿:網(wǎng)友

推薦閱讀:Android中微信搶紅包插件原理解析及開發(fā)思路

搶紅包的原理都差不多,一般是用Android的輔助功能(AccessibilityService類)先監(jiān)聽通知欄事件或窗口變化事件來查找紅包關(guān)鍵字然后去模擬點(diǎn)擊或打開紅包。

下面附上源碼,程序已實(shí)現(xiàn)自動搶紅包,鎖屏黑屏狀態(tài)自動解鎖亮屏,Android4.X測試通過。函數(shù)具體功能請看詳細(xì)注釋。
注:在聊天界面收到紅包不會自動打開,因?yàn)橥ㄖ獧跊]有消息提示從而監(jiān)聽不了,此時只需手動點(diǎn)一下即可。其他未知情況請自行用LogCat調(diào)試,源碼已經(jīng)有相關(guān)的調(diào)試信息。軟件僅供學(xué)習(xí)娛樂。

<pre style="margin-top: 0px; margin-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(192, 192, 192);"></span><pre style="margin-top: 0px; margin-bottom: 0px;">import java.util.Calendar; import java.util.List; import android.accessibilityservice.AccessibilityService; import android.annotation.SuppressLint; import android.app.KeyguardManager; import android.app.KeyguardManager.KeyguardLock; import android.app.Notification; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.Context; import android.media.MediaPlayer; import android.os.PowerManager; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; public class Demo extends AccessibilityService {private boolean canGet = false;//能否點(diǎn)擊紅包private boolean enableKeyguard = true;//默認(rèn)有屏幕鎖//窗口狀態(tài)private static final int WINDOW_NONE = 0;private static final int WINDOW_LUCKYMONEY_RECEIVEUI = 1;private static final int WINDOW_LUCKYMONEY_DETAIL = 2;private static final int WINDOW_LAUNCHER = 3;private static final int WINDOW_OTHER = -1;//當(dāng)前窗口private int mCurrentWindow = WINDOW_NONE;//鎖屏、解鎖相關(guān)private KeyguardManager km;private KeyguardLock kl;//喚醒屏幕相關(guān)private PowerManager pm;private PowerManager.WakeLock wl = null;//播放提示聲音private MediaPlayer player;public void playSound(Context context) {Calendar cal = Calendar.getInstance();int hour = cal.get(Calendar.HOUR_OF_DAY);//夜間不播放提示音if(hour > 7 && hour < 22) { player.start();}}//喚醒屏幕和解鎖private void wakeAndUnlock(boolean unLock){if(unLock){//若為黑屏狀態(tài)則喚醒屏幕if(!pm.isScreenOn()) {//獲取電源管理器對象,ACQUIRE_CAUSES_WAKEUP這個參數(shù)能從黑屏喚醒屏幕wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "bright");//點(diǎn)亮屏幕wl.acquire();Log.i("demo", "亮屏");}//若在鎖屏界面則解鎖直接跳過鎖屏if(km.inKeyguardRestrictedInputMode()) {//設(shè)置解鎖標(biāo)志,以判斷搶完紅包能否鎖屏enableKeyguard = false;//解鎖kl.disableKeyguard();Log.i("demo", "解鎖");}}else{//如果之前解過鎖則加鎖以恢復(fù)原樣if(!enableKeyguard) {//鎖屏kl.reenableKeyguard();Log.i("demo", "加鎖");}//若之前喚醒過屏幕則釋放之使屏幕不保持常亮if(wl != null) {wl.release();wl = null;Log.i("demo", "關(guān)燈");}}}//通過文本查找節(jié)點(diǎn)public AccessibilityNodeInfo findNodeInfosByText(AccessibilityNodeInfo nodeInfo, String text) {List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text);if(list == null || list.isEmpty()) {return null;}return list.get(0);}//模擬點(diǎn)擊事件public void performClick(AccessibilityNodeInfo nodeInfo) {if(nodeInfo == null) {return;}if(nodeInfo.isClickable()) {nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);} else {performClick(nodeInfo.getParent());}}//模擬返回事件public void performBack(AccessibilityService service) {if(service == null) {return;}service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);}//實(shí)現(xiàn)輔助功能@Override public void onAccessibilityEvent(AccessibilityEvent event) { int eventType = event.getEventType();Log.i("demo", Integer.toString(eventType));switch (eventType) { //第一步:監(jiān)聽通知欄消息 case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: List<CharSequence> texts = event.getText(); if (!texts.isEmpty()) { for (CharSequence text : texts) { String content = text.toString(); Log.i("demo", "text:"+content);//收到紅包提醒if (content.contains("[微信紅包]")||content.contains("[QQ紅包]")) { //模擬打開通知欄消息 if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {//播放提示音playSound(this);//若是微信紅包則解鎖并自動打開,若是qq紅包則只提示并跳轉(zhuǎn)到有紅包的聊天界面,暫未實(shí)現(xiàn)qq紅包自動領(lǐng)取功能if(content.contains("[微信紅包]"))wakeAndUnlock(true);Log.i("demo", "canGet=true");canGet = true;try {Notification notification = (Notification) event.getParcelableData(); PendingIntent pendingIntent = notification.contentIntent; pendingIntent.send();} catch (CanceledException e) { e.printStackTrace(); }}break;} } } break;//第二步:監(jiān)聽是否進(jìn)入微信紅包消息界面 case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:String className = event.getClassName().toString();if (className.equals("com.tencent.mm.ui.LauncherUI")) { mCurrentWindow = WINDOW_LAUNCHER;//開始搶紅包 Log.i("demo", "準(zhǔn)備搶紅包...");getPacket();} else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI")) {mCurrentWindow = WINDOW_LUCKYMONEY_RECEIVEUI;//開始打開紅包Log.i("demo", "打開紅包");openPacket();wakeAndUnlock(false);} else if(className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI")) {mCurrentWindow = WINDOW_LUCKYMONEY_DETAIL;//返回以方便下次收紅包Log.i("demo", "返回");performBack(this);} else {mCurrentWindow = WINDOW_OTHER;}break;case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:if(mCurrentWindow != WINDOW_LAUNCHER) { //不在聊天界面或聊天列表,不處理return;}if(canGet) {getPacket();}break;}}//找到紅包并點(diǎn)擊@SuppressLint("NewApi") private void getPacket() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo == null) { return; }// 找到領(lǐng)取紅包的點(diǎn)擊事件 List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("領(lǐng)取紅包");if(list != null ) {if(list.isEmpty()) {Log.i("demp", "領(lǐng)取列表為空");// 從消息列表查找紅包AccessibilityNodeInfo node = findNodeInfosByText(nodeInfo, "[微信紅包]");if(node != null) {canGet = true;performClick(node);}}else {if(canGet) {//最新的紅包領(lǐng)起AccessibilityNodeInfo node = list.get(list.size() - 1);performClick(node);Log.i("demo", "canGet=false");canGet = false;}}}}//打開紅包@SuppressLint("NewApi") private void openPacket() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if(nodeInfo == null) {return;}Log.i("demo", "查找打開按鈕...");AccessibilityNodeInfo targetNode = null;//如果紅包已經(jīng)被搶完則直接返回targetNode = findNodeInfosByText(nodeInfo, "看看大家的手氣");if(targetNode != null) {performBack(this);return;}//通過組件名查找開紅包按鈕,還可通過組件id直接查找但需要知道id且id容易隨版本更新而變化,舊版微信還可直接搜“

主站蜘蛛池模板:
夏河县|
集贤县|
育儿|
西贡区|
乌苏市|
曲阜市|
大关县|
福建省|
西青区|
秭归县|
尚志市|
石门县|
邳州市|
扎鲁特旗|
伊吾县|
新野县|
崇文区|
桓台县|
祁阳县|
许昌市|
巨鹿县|
吴堡县|
临沭县|
重庆市|
昌江|
合作市|
武穴市|
天全县|
龙州县|
天津市|
长泰县|
凉山|
三原县|
博湖县|
长武县|
河池市|
宁蒗|
沾益县|
靖江市|
衡南县|
建德市|