下集预告:
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;    }}

更多相关文章

  1. 【Android】事件分发机制
  2. Android事件传递机制
  3. android监听事件添加动作的三种方式
  4. Android应用实例之----基于Service与ContentProvider的音乐播放
  5. 利用drozer进行Android渗透测试
  6. android 应用如何获取系统权限 以及root系统方法
  7. android获取各种系统路径的方法
  8. Android(安卓)编程下 Touch 事件的分发和消费机制
  9. Android修行之路——Android程序设计基础(一)

随机推荐

  1. Android(安卓)窗体泄露问题
  2. android 调用图库并显示选择的图片
  3. android 处理图片工具
  4. android Volley 使用
  5. 图标集合-系统默认
  6. android语音识别demo
  7. Android(安卓)dp转px
  8. android SwipeRefreshLayout 下拉刷新控
  9. 如何去掉listview黑边问题
  10. Android(安卓)Sharepreferrence 保存数据