/*** 叮咚买菜辅助*/
public class DingdongService extends AccessibilityService {private static final String PACKAGE_NAME = "";private Rect payRect;@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {CharSequence packageName = PackageName();XLog.i("进入了叮咚买菜:%s", packageName);if (!packageName.equals(PACKAGE_NAME)) {return;}AccessibilityNodeInfo source = Source();if (source == null) {return;}XLog.i("进入了叮咚买菜");clickPay(source);clickTime(source);continuePay(source);payConfirm(source);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private void clickTime(AccessibilityNodeInfo source) {String viewId = ":id/cl_item_select_hour_root";List<AccessibilityNodeInfo> timeList = source.findAccessibilityNodeInfosByViewId(viewId);if (timeList == null || timeList.size() == 0) {onBack(source);return;}boolean ok = false;int size = timeList.size();for (int i = size - 1; i >= 0; i--) {AccessibilityNodeInfo item = (i);if (item.isClickable()) {if (findByText(item, "已约满") == null) {AccessibilityNodeInfo nodeTitle = findById(item, ":id/tv_item_select_hour_title");if (nodeTitle != null) {XLog.i("选中了时间,请确认付款...%s", Text());}item.performAction(AccessibilityNodeInfo.ACTION_CLICK);ok = true;break;}}}if (!ok) {XLog.i("抢菜失败,退出继续点击支付...");onBack(source);}}private void payConfirm(AccessibilityNodeInfo source) {AccessibilityNodeInfo pay = findByText(source, "确认交易");if (pay == null) {return;}pay.performAction(AccessibilityNodeInfo.ACTION_CLICK);}private void continuePay(AccessibilityNodeInfo source) {AccessibilityNodeInfo pay = findByText(source, "继续支付");if (pay == null) {return;}pay.performAction(AccessibilityNodeInfo.ACTION_CLICK);}private void clickPay(AccessibilityNodeInfo source) {AccessibilityNodeInfo pay = findByText(source, "立即支付");if (pay == null) {return;}pay.performAction(AccessibilityNodeInfo.ACTION_CLICK);payRect = new Rect();XLog.i("获取支付坐标....%s", payRect);BoundsInScreen(payRect);}private AccessibilityNodeInfo findByText(AccessibilityNodeInfo source, String text) {List<AccessibilityNodeInfo> pay = source.findAccessibilityNodeInfosByText(text);if (pay == null || pay.size() == 0) {return null;}for (AccessibilityNodeInfo item : pay) {return item;}return null;}private AccessibilityNodeInfo findById(AccessibilityNodeInfo source, String id) {List<AccessibilityNodeInfo> pay = source.findAccessibilityNodeInfosByViewId(id);if (pay == null || pay.size() == 0) {return null;}for (AccessibilityNodeInfo item : pay) {return item;}return null;}@Overridepublic void onInterrupt() {}@Overrideprotected void onServiceConnected() {ServiceConnected();XLog.i("辅助服务启动成功...");}public void onBack(AccessibilityNodeInfo source) {String viewId = ":id/iv_dialog_select_time_close";List<AccessibilityNodeInfo> timeList = source.findAccessibilityNodeInfosByViewId(viewId);if (timeList == null || timeList.size() == 0) {XLog.i("没有找到关闭按钮");return;}XLog.i("找到了关闭按钮:%s", timeList.size());for (AccessibilityNodeInfo item : timeList) {if (item.isClickable()) {item.performAction(AccessibilityNodeInfo.ACTION_CLICK);XLog.i("关闭菜单");if (payRect != null) {XLog.i("点击支付坐标....%s", payRect);click(new X(), Y()));return;}}}Point point = new Point(10, 10);click(point);XLog.i("点击失败...");}@TargetApi(24)public void click(Point point) {//只有7.0才可以用GestureDescription.Builder builder = new GestureDescription.Builder();Path path = new Path();veTo((float) point.x, (float) point.y);path.lineTo((float) point.x, (float) point.y);/*** 参数path:笔画路径* 参数startTime:时间 (以毫秒为单位),从手势开始到开始笔划的时间,非负数* 参数duration:笔划经过路径的持续时间(以毫秒为单位),非负数*/builder.addStroke(new GestureDescription.StrokeDescription(path, 1, 1));final GestureDescription build = builder.build();/*** 参数GestureDescription:翻译过来就是手势的描述,如果要实现模拟,首先要描述你的腰模拟的手势嘛* 参数GestureResultCallback:翻译过来就是手势的回调,手势模拟执行以后回调结果* 参数handler:大部分情况我们不用的话传空就可以了* 一般我们关注GestureDescription这个参数就够了,下边就重点介绍一下这个参数*/dispatchGesture(build, new GestureResultCallback() {public void onCancelled(GestureDescription gestureDescription) {Cancelled(gestureDescription);}public void onCompleted(GestureDescription gestureDescription) {Completed(gestureDescription);}}, null);}}
叮咚买菜辅助核心代码
配置文档accessibility_l
<?xml version="1.0" encoding="utf-8"?>
<accessibility-servicexmlns:android=""android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged|typeNotificationStateChanged"android:accessibilityFeedbackType="feedbackAllMask"android:packageNames=""android:notificationTimeout="10"android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"android:canRetrieveWindowContent="true"/>
<serviceandroid:name=".maicai.DingdongService"android:exported="false"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility_service_config" />
</service>
手动授权辅助服务启动
/*** 该辅助功能开关是否打开了** @param accessibilityServiceName:指定辅助服务名字* @param context:上下文* @return*/private boolean isAccessibilitySettingsOn(String accessibilityServiceName, Context context) {int accessibilityEnable = 0;String serviceName = PackageName() + "/" + accessibilityServiceName;try {accessibilityEnable = ContentResolver(),Settings.Secure.ACCESSIBILITY_ENABLED, 0);} catch (Exception e) {XLog.e("get accessibility enable failed, the err:" + e.getMessage());}if (accessibilityEnable == 1) {TextUtils.SimpleStringSplitter mStringColonSplitter= new TextUtils.SimpleStringSplitter(':');String settingValue = ContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);if (settingValue != null) {mStringColonSplitter.setString(settingValue);while (mStringColonSplitter.hasNext()) {String accessibilityService = ();if (accessibilityService.equalsIgnoreCase(serviceName)) {XLog.v("We've found the correct setting - accessibility is switched on!");return true;}}}} else {XLog.w("Accessibility service disable");}return false;}/*** 跳转到系统设置页面开启辅助功能** @param accessibilityServiceName:指定辅助服务名字* @param context:上下文*/private void openAccessibility(String accessibilityServiceName, Context context) {if (!isAccessibilitySettingsOn(accessibilityServiceName, context)) {Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);context.startActivity(intent);}}
本文发布于:2024-02-03 23:38:31,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170697700851662.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |