android 借助AccessibilityService实现模拟点击功能-几个工具类(二)
16lz
2021-01-23
下集预告:
android 借助AccessibilityService实现模拟点击功能-onAccessibilityEvent接收事件的详细处理(三)
此篇附上我常用的工具类
-
日志工具。(打印出当前类名行号,快速定位代码)
public class L { private static String className;//类名 private static String methodName;//方法名 private static int lineNumber;//行数 private static boolean isDebug = false;//是否是debug模式 private L() { } public static void setDebug(boolean b) { isDebug = b; } private static boolean isDebuggable() {// return BuildConfig.DEBUG; return isDebug; } private static String createLog(String log) { StringBuffer buffer = new StringBuffer(); buffer.append(methodName); buffer.append("(").append(className).append(":").append(lineNumber).append(")"); buffer.append(log); return buffer.toString(); } private static void getMethodNames(StackTraceElement[] sElements) { className = sElements[1].getFileName(); methodName = sElements[1].getMethodName(); lineNumber = sElements[1].getLineNumber(); } public static void e(String message) { if (!isDebuggable()) return; getMethodNames(new Throwable().getStackTrace()); Log.e(className, createLog(message)); } public static void i(String message) { if (!isDebuggable()) return; getMethodNames(new Throwable().getStackTrace()); Log.i(className, createLog(message)); } public static void d(String message) { if (!isDebuggable()) return; getMethodNames(new Throwable().getStackTrace()); Log.d(className, createLog(message)); } public static void v(String message) { if (!isDebuggable()) return; getMethodNames(new Throwable().getStackTrace()); Log.v(className, createLog(message)); } public static void w(String message) { if (!isDebuggable()) return; getMethodNames(new Throwable().getStackTrace()); Log.w(className, createLog(message)); } public static void wtf(String message) { if (!isDebuggable()) return; getMethodNames(new Throwable().getStackTrace()); Log.wtf(className, createLog(message)); }}
-
辅助服务工具类。(获取节点对象,滑动,点击,)
public class AccessibilityHelper { private static final String TAG = AccessibilityHelper.class.getSimpleName(); public static AccessibilityService mService; /** * 判断辅助服务是否正在运行 */ public static boolean isServiceRunning(AccessibilityService service) { if (service == null) { return false; } AccessibilityManager accessibilityManager = (AccessibilityManager) service.getSystemService(Context.ACCESSIBILITY_SERVICE); AccessibilityServiceInfo info = service.getServiceInfo(); if (info == null) { return false; } List list = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC); Iterator iterator = list.iterator(); boolean isConnect = false; while (iterator.hasNext()) { AccessibilityServiceInfo i = iterator.next(); if (i.getId().equals(info.getId())) { isConnect = true; break; } } if (!isConnect) { return false; } return true; } /** * 打开辅助服务的设置 */ public static void openAccessibilityServiceSettings(Activity context) { try { Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } /** * 自动点击按钮 * * @param event * @param nodeText 按钮文本 */ public static void handleEvent(AccessibilityEvent event, String nodeText) { List unintall_nodes = event.getSource().findAccessibilityNodeInfosByText(nodeText); if (unintall_nodes != null && !unintall_nodes.isEmpty()) { AccessibilityNodeInfo node; for (int i = 0; i < unintall_nodes.size(); i++) { node = unintall_nodes.get(i); if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } } /** * 获取text */ public static String getNodeText(String id) { List unintall_nodes = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(id); if (unintall_nodes != null && !unintall_nodes.isEmpty()) { return unintall_nodes.get(0).getText().toString().trim(); } return null; } /** * 获取text */ public static String getNodeText(AccessibilityNodeInfo nodeInfo, String id) { List unintall_nodes = nodeInfo.findAccessibilityNodeInfosByViewId(id); if (unintall_nodes != null && !unintall_nodes.isEmpty()) { return unintall_nodes.get(0).getText().toString().trim(); } return null; } private AccessibilityHelper() { } //通过id查找 public static AccessibilityNodeInfo findNodeInfosById(AccessibilityNodeInfo nodeInfo, String resId) { if (nodeInfo == null) return null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { List list = nodeInfo.findAccessibilityNodeInfosByViewId(resId); if (list != null && !list.isEmpty()) { return list.get(0); } } return null; } //通过id查找 public static AccessibilityNodeInfo findNodeInfosById(String resId) { if (mService.getRootInActiveWindow() != null) { List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(resId); if (list != null && !list.isEmpty()) { return list.get(0); } } return null; } //通过id查找 public static List findNodeListInfosById(String resId) { List result = new ArrayList<>(); if (mService.getRootInActiveWindow() != null) { List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(resId); if (list != null) { result.addAll(list); } } return result; } //通过id查找 ,第i个组件 public static AccessibilityNodeInfo findNodeInfosById(String resId, int index) { List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(resId); if (list != null && list.size() > index) { return list.get(index); } return null; } //返回指定位置的node public static AccessibilityNodeInfo findNodeInfosByIdAndPosition(AccessibilityNodeInfo nodeInfo, String resId, int position) { if (nodeInfo == null) return null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { List list = nodeInfo.findAccessibilityNodeInfosByViewId(resId); for (int i = 0; i < list.size(); i++) { if (i == position) { return list.get(i); } } } return null; } //通过某个文本查找 public static AccessibilityNodeInfo findNodeInfosByText(AccessibilityNodeInfo nodeInfo, String text) { if (nodeInfo == null) return null; List list = nodeInfo.findAccessibilityNodeInfosByText(text); if (list == null || list.isEmpty()) { return null; } return list.get(0); } //通过某个文本查找 public static AccessibilityNodeInfo findNodeInfosByText(String text) { if (mService.getRootInActiveWindow() != null) { List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByText(text); if (list == null || list.isEmpty()) { return null; } return list.get(0); } return null; } //通过ClassName查找 public static AccessibilityNodeInfo findNodeInfosByClassName(AccessibilityNodeInfo nodeInfo, String className) { if (TextUtils.isEmpty(className)) { return null; } for (int i = 0; nodeInfo != null && i < nodeInfo.getChildCount(); i++) { AccessibilityNodeInfo node = nodeInfo.getChild(i); if (node != null) { if (className.equals(node.getClassName())) { return node; } else if (node.getChildCount() > 0) { findNodeInfosByClassName(node, className); } } } return null; } //通过ClassName查找 public static List findNodeInfoListByClassName(AccessibilityNodeInfo nodeInfo, String className) { if (TextUtils.isEmpty(className)) { return Collections.EMPTY_LIST; } List result = new ArrayList<>(); for (int i = 0; nodeInfo != null && i < nodeInfo.getChildCount(); i++) { AccessibilityNodeInfo node = nodeInfo.getChild(i); if (node != null && className.equals(node.getClassName())) { result.add(node); } } return result; } //通过ClassName查找 public static AccessibilityNodeInfo findNodeInfosByClassName(String className) { return findNodeInfosByClassName(mService.getRootInActiveWindow(), className); } /** * 找父组件 */ public static AccessibilityNodeInfo findParentNodeInfosByClassName(AccessibilityNodeInfo nodeInfo, String className) { if (nodeInfo == null) { return null; } if (TextUtils.isEmpty(className)) { return null; } if (className.equals(nodeInfo.getClassName())) { return nodeInfo; } return findParentNodeInfosByClassName(nodeInfo.getParent(), className); } private static final Field sSourceNodeField; static { Field field = null; try { field = AccessibilityNodeInfo.class.getDeclaredField("mSourceNodeId"); field.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } sSourceNodeField = field; } public static long getSourceNodeId(AccessibilityNodeInfo nodeInfo) { if (sSourceNodeField == null) { return -1; } try { return sSourceNodeField.getLong(nodeInfo); } catch (Exception e) { e.printStackTrace(); } return -1; } public static String getViewIdResourceName(AccessibilityNodeInfo nodeInfo) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { return nodeInfo.getViewIdResourceName(); } return null; } //返回HOME界面 public static void performHome(AccessibilityService service) { if (service == null) { return; } service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME); } //返回 public static void performBack(AccessibilityService service) { if (service == null) { return; } service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); } //返回 public static void performBack() { //默认使用MainService if (AccessibilityHelper.mService == null) { return; } AccessibilityHelper.mService.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); } /** * 点击事件 */ public static void performClick(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return; } if (nodeInfo.isClickable()) { nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); } else { performClick(nodeInfo.getParent()); } } /** * 点击事件 */ public static void performClick(String id) { performClick(findNodeInfosById(id)); } //长按事件 public static void performLongClick(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return; } nodeInfo.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK); } //move 事件 public static void performMoveDown(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return; } nodeInfo.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN.getId()); } //ACTION_SCROLL_FORWARD 事件 public static boolean perform_scroll_forward(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return false; } return nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); } //ACTION_SCROLL_BACKWARD 后退事件 public static boolean perform_scroll_backward(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return false; } return nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); } //粘贴 @TargetApi(18) public static void performPaste(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return; } nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE); } //设置editview text @TargetApi(21) public static void performSetText(AccessibilityNodeInfo nodeInfo, String text) { if (nodeInfo == null) { return; } CharSequence className = nodeInfo.getClassName(); if ("android.widget.EditText".equals(className)) {//||"android.widget.TextView".equals(className) Bundle arguments = new Bundle(); arguments.putCharSequence(AccessibilityNodeInfo .ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text); nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); } }}
- 延时,异步,睡眠线程
依赖:compile 'org.jdeferred:jdeferred-android-aar:1.2.4'public class UiKit {private static final AndroidDeferredManager gDM = new AndroidDeferredManager();private static final Handler gUiHandler = new Handler(Looper.getMainLooper());public static AndroidDeferredManager defer() {return gDM;}public static int dpToPx(Context context, int dp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,context.getResources().getDisplayMetrics());}public static void post(Runnable r) {gUiHandler.post(r);}public static void postDelayed(long delay, Runnable r) {gUiHandler.postDelayed(r, delay);}public static void sleep(long time) {try {Thread.sleep(time);} catch (InterruptedException e) {e.printStackTrace();}}public static void sleep() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}
- 微信工具类
public class WeChatHelper { private WeChatHelper() { } private static final WeChatHelper instance = new WeChatHelper(); public static WeChatHelper init() { return instance; } /**打开微信主界面*/ public static void openWechat(Context context) { try { Intent intent = new Intent(); ComponentName cmp = new ComponentName(WechatUI.WECHAT_PACKAGE_NAME, WechatUI.UI_LUANCHER); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setComponent(cmp); context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } /** * 获取微信的版本 */ public static int getWechatVersion(Context context) { PackageInfo mWechatPackageInfo = getPackageInfo(context); if (mWechatPackageInfo == null) { return 0; } return mWechatPackageInfo.versionCode; } /** * 获取微信的版本名称 */ public static String getWechatVersionName(Context context) { PackageInfo mWechatPackageInfo = getPackageInfo(context); if (mWechatPackageInfo == null) { return ""; } return mWechatPackageInfo.versionName; }/**微信7.0.0以上*/ public static boolean above700() { return getWechatVersion(LibInstance.getInstance().getTaskListener().provideContext()) >= 1380; } /**微信6.7.3以上*/ public static boolean above673() { return getWechatVersion(LibInstance.getInstance().getTaskListener().provideContext()) >= 1360; } /** * 更新微信包信息 */ private static PackageInfo getPackageInfo(Context context) { PackageInfo mWechatPackageInfo = null; try { mWechatPackageInfo = context.getPackageManager().getPackageInfo(WechatUI.WECHAT_PACKAGE_NAME, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return mWechatPackageInfo; }}
更多相关文章
- android监听事件添加动作的三种方式
- 【Android】事件分发机制
- Android笔记1——Android SDK自带的工具和命令
- Android 定时/倒计时工具 - 加强版 CountDownTimer
- android官方技术文档翻译——工具属性
- Android--自定义带提示文本的EditText组件
- Android文件解压工具类
- Android 点击事件分发