简单实现了微信自动抢红包的服务,原理就是根据关键字找到相应的view, 然后自动点击。主要是用到accessibilityservice这个辅助服务,基本可以满足自动抢红包的功能,但是有些逻辑需要优化,比如,拆完一个红包后,必须手动点击返回键,才能进行下一次自动抢红包。
androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jackie.webchatenvelope" >
<application
android:allowbackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/apptheme" >
<activity
android:name=".mainactivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<service
android:enabled="true"
android:exported="true"
android:label="@string/app_name"
android:name=".envelopeservice"
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/envelope_service_config"/>
</service>
</application>
</manifest>
envelope_service_config.xml
<?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=""
android:canretrievewindowcontent="true"
android:description="@string/accessibility_description"
android:notificationtimeout="100"
android:packagenames="com.tencent.mm" />
activity_main.xml
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingbottom="@dimen/activity_vertical_margin"
android:paddingleft="@dimen/activity_horizontal_margin"
android:paddingright="@dimen/activity_horizontal_margin"
android:paddingtop="@dimen/activity_vertical_margin"
tools:context=".mainactivity">
<button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_centerinparent="true"
android:textsize="18sp"
android:text="打开辅助服务"/>
</relativelayout>
mainactivity.java
package com.jackie.webchatenvelope;
import android.app.activity;
import android.content.intent;
import android.os.bundle;
import android.view.menu;
import android.view.menuitem;
import android.view.view;
import android.widget.button;
import android.widget.toast;
public class mainactivity extends activity {
private button startbtn;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
startbtn = (button) findviewbyid(r.id.start);
startbtn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
try {
//打开系统设置中辅助功能
intent intent = new intent(android.provider.settings.action_accessibility_settings);
startactivity(intent);
toast.maketext(mainactivity.this, "找到抢红包,然后开启服务即可", toast.length_long).show();
} catch (exception e) {
e.printstacktrace();
}
}
});
}
@override
public boolean oncreateoptionsmenu(menu menu) {
// inflate the menu; this adds items to the action bar if it is present.
getmenuinflater().inflate(r.menu.menu_main, menu);
return true;
}
@override
public boolean onoptionsitemselected(menuitem item) {
// handle action bar item clicks here. the action bar will
// automatically handle clicks on the home/up button, so long
// as you specify a parent activity in androidmanifest.xml.
int id = item.getitemid();
//noinspection simplifiableifstatement
if (id == r.id.action_settings) {
return true;
}
return super.onoptionsitemselected(item);
}
}
envelopeservice.java
package com.jackie.webchatenvelope;
import android.accessibilityservice.accessibilityservice;
import android.annotation.targetapi;
import android.app.notification;
import android.app.pendingintent;
import android.os.build;
import android.os.handler;
import android.util.log;
import android.view.accessibility.accessibilityevent;
import android.view.accessibility.accessibilitymanager;
import android.view.accessibility.accessibilitynodeinfo;
import android.widget.toast;
import java.util.list;
/**
* <p>created by administrator</p>
* <p/>
* 抢红包外挂服务
*/
public class envelopeservice extends accessibilityservice {
static final string tag = "jackie";
/**
* 微信的包名
*/
static final string wechat_packagename = "com.tencent.mm";
/**
* 红包消息的关键字
*/
static final string envelope_text_key = "[微信红包]";
handler handler = new handler();
@override
public void onaccessibilityevent(accessibilityevent event) {
final int eventtype = event.geteventtype();
log.d(tag, "事件---->" + event);
//通知栏事件
if (eventtype == accessibilityevent.type_notification_state_changed) {
list<charsequence> texts = event.gettext();
if (!texts.isempty()) {
for (charsequence t : texts) {
string text = string.valueof(t);
if (text.contains(envelope_text_key)) {
opennotification(event);
break;
}
}
}
} else if (eventtype == accessibilityevent.type_window_state_changed) {
openenvelope(event);
}
}
/*@override
protected boolean onkeyevent(keyevent event) {
//return super.onkeyevent(event);
return true;
}*/
@override
public void oninterrupt() {
toast.maketext(this, "中断抢红包服务", toast.length_short).show();
}
@override
protected void onserviceconnected() {
super.onserviceconnected();
toast.maketext(this, "连接抢红包服务", toast.length_short).show();
}
private void sendnotificationevent() {
accessibilitymanager manager = (accessibilitymanager) getsystemservice(accessibility_service);
if (!manager.isenabled()) {
return;
}
accessibilityevent event = accessibilityevent.obtain(accessibilityevent.type_notification_state_changed);
event.setpackagename(wechat_packagename);
event.setclassname(notification.class.getname());
charsequence tickertext = envelope_text_key;
event.gettext().add(tickertext);
manager.sendaccessibilityevent(event);
}
/**
* 打开通知栏消息
*/
@targetapi(build.version_codes.jelly_bean)
private void opennotification(accessibilityevent event) {
if (event.getparcelabledata() == null || !(event.getparcelabledata() instanceof notification)) {
return;
}
//以下是精华,将微信的通知栏消息打开
notification notification = (notification) event.getparcelabledata();
pendingintent pendingintent = notification.contentintent;
try {
pendingintent.send();
} catch (pendingintent.canceledexception e) {
e.printstacktrace();
}
}
@targetapi(build.version_codes.jelly_bean)
private void openenvelope(accessibilityevent event) {
if ("com.tencent.mm.plugin.luckymoney.ui.luckymoneyreceiveui".equals(event.getclassname())) {
//点中了红包,下一步就是去拆红包
checkkey1();
} else if ("com.tencent.mm.plugin.luckymoney.ui.luckymoneydetailui".equals(event.getclassname())) {
//拆完红包后看详细的纪录界面
//nonething
} else if ("com.tencent.mm.ui.launcherui".equals(event.getclassname())) {
//在聊天界面,去点中红包
checkkey2();
}
}
@targetapi(build.version_codes.jelly_bean)
private void checkkey1() {
accessibilitynodeinfo nodeinfo = getrootinactivewindow();
if (nodeinfo == null) {
log.w(tag, "rootwindow为空");
return;
}
list<accessibilitynodeinfo> list = nodeinfo.findaccessibilitynodeinfosbytext("拆红包");
for (accessibilitynodeinfo n : list) {
n.performaction(accessibilitynodeinfo.action_click);
}
}
@targetapi(build.version_codes.jelly_bean)
private void checkkey2() {
accessibilitynodeinfo nodeinfo = getrootinactivewindow();
if (nodeinfo == null) {
log.w(tag, "rootwindow为空");
return;
}
list<accessibilitynodeinfo> list = nodeinfo.findaccessibilitynodeinfosbytext("领取红包");
if (list.isempty()) {
list = nodeinfo.findaccessibilitynodeinfosbytext(envelope_text_key);
for (accessibilitynodeinfo n : list) {
log.i(tag, "-->微信红包:" + n);
n.performaction(accessibilitynodeinfo.action_click);
break;
}
} else {
//最新的红包领起
for (int i = list.size() - 1; i >= 0; i--) {
accessibilitynodeinfo parent = list.get(i).getparent();
log.i(tag, "-->领取红包:" + parent);
if (parent != null) {
parent.performaction(accessibilitynodeinfo.action_click);
break;
}
}
}
}
}
以上就是分享一个android实现微信自动抢红包的代码实例的详细内容。