又是興趣系列
網上有很多自動強紅包的例子和代碼,筆者也是做了一些最佳化。
先說說自己的兩個個優勢
1.可以在聊天介面自動強不依賴於通知欄推送
2.可以在螢幕熄滅的時候的時候點亮螢幕自動搶(目前只測過flyme)
先上圖:
代碼傳送門:
https://github.com/AndroidMsky/WXhongbao
歡迎點星星~
原理:
通過AccessibilityService監聽到狀態列通知,進行類比點擊,擷取螢幕中view節點為領取紅包的list並且點擊最後一個。
如果不通過狀態列通知,通過視圖變化AccessibilityEvent的2048事件也是就
public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;
每次接受到新訊息都會有這個時間的回調:
public void onAccessibilityEvent(AccessibilityEvent event) { int eventType = event.getEventType(); if (auto) Log.e("AAAAAAAA", "有事件" + eventType); switch (eventType) { //當通知欄發生改變時 case 2048: pubclassName = event.getClassName().toString(); Log.e("AAAAAAAA", "有2048事件" + pubclassName + auto); if (!auto && pubclassName.equals("android.widget.TextView") && ALL) { Log.e("AAAAAAAA", "有2048事件被識別" + auto + pubclassName); getLastPacket(1); } if (auto && WXMAIN) { getLastPacket(); auto = false; } break;
所以在接受的時候,去處理一下去點擊領取紅包。然而這個方法會被頻發調用,我們就加一個”Android.widget.TextView”事件類別的篩選,然後還是會被很頻繁調用,會比較遲效能耗電。
那就加個布爾ALL標誌位,讓使用者控制是否開啟聊天介面內也搶紅包的模式。
為了不反覆領取要記錄上次介面內的紅包數量在紅包增加的時候才去領取:
private void getLastPacket(int c) { Log.e("AAAAAAAA", "新方法" + parents.size()); AccessibilityNodeInfo rootNode = getRootInActiveWindow(); recycle(rootNode); Log.e("AAAAAAAA", "last++" + lastbagnum + "當前頁面紅包數" + parents.size()); if (parents.size() > 0 && WXMAIN) { Log.e("AAAAAAAA", "頁面大於O且在微信介面"); if (lastbagnum < parents.size()) parents.get(parents.size() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK); lastbagnum = parents.size(); parents.clear(); } }
目前在通過外掛程式領過幾個紅包後,一個聊天介面突然發第一個紅包(沒有通知欄)會有一定幾率領取不到,再繼續發就正常了,應該是清空問題,該bug筆者也在更改邏輯中。
點亮螢幕方法(有密碼肯定是不行的):
private void wakeAndUnlock2(boolean b) { if(b) { //擷取電源管理器對象 pm=(PowerManager) getSystemService(Context.POWER_SERVICE); //擷取PowerManager.WakeLock對象,後面的參數|表示同時傳入兩個值,最後的是調試用的Tag wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright"); //點亮螢幕 wl.acquire(); //得到鍵盤鎖管理器對象 km= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE); kl = km.newKeyguardLock("unLock"); //解鎖 kl.disableKeyguard(); } else { //鎖屏 kl.reenableKeyguard(); //釋放wakeLock,關燈 wl.release(); } }
接受到通知欄的紅包訊息亮屏設定標誌位為自動領取,調取領取函數:
if (content.contains("[微信紅包]")) { if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) { Notification notification = (Notification) event.getParcelableData(); PendingIntent pendingIntent = notification.contentIntent; try { auto = true; wakeAndUnlock2(true); pendingIntent.send(); Log.e("demo", "進入微信" + auto + event.getClassName().toString()); } catch (Exception e) { e.printStackTrace(); } } }
點擊介面控制項方法:(不同微信版本控制項id不一樣我的是6.3.25)如果不知道怎麼擷取這個id可以看下面的參考文獻最後一個,右側的resource-id就是這個id
click("com.tencent.mm:id/bag");
在Activity中設定聊天中領取開關:
public void start(View v) { if (AirAccessibilityService.ALL) { AirAccessibilityService.ALL = false; ((Button) v).setText("對話內監控+關"); } else { AirAccessibilityService.ALL = true; ((Button) v).setText("對話內監控+開"); } ; }
AccessibilityService的確很吊,你用AccessibilityService或者root後的安卓手機能幹太多事了,或好或壞,但畢竟技術是無罪的。
同時也推薦我的文章:
安卓手機變網路攝影機,自動接起QQ電話
歡迎關注作者。歡迎評論討論。歡迎拍磚。 如果覺得這篇文章對你有協助,歡迎打賞, 歡迎star,Fork我的github。 喜歡作者的也可以Follow。也算對作者的一種支援。 本文Github代碼連結
https://github.com/AndroidMsky/WXhongbao
也是看了很多資料謝謝各路英雄好漢們
參考文章:
Android喚醒、解鎖螢幕代碼執行個體
Android實現微信自動搶紅包的程式
Android AccessibilityService實現微信搶紅包外掛程式
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。