AndroidアクセスbilityServiceによるアナログクリック機能-いくつかのツールクラス(2)

18158 ワード

次回予告:androidアクセスbilityServiceによるアナログクリック機能-onAccessibilityEvent受信イベントの詳細処理(3)
この記事には、私がよく使うツールクラスを添付します.
  • ログツール.(現在のクラス名行番号、クイックロケータコードを印刷)
    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;
        }
    }