Java Code Examples for android.view.accessibility.AccessibilityNodeInfo#getText()

The following examples show how to use android.view.accessibility.AccessibilityNodeInfo#getText() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: BaseElementHandler.java    From za-Farmer with MIT License 6 votes vote down vote up
@Override
public boolean checkCriteria(AccessibilityNodeInfo node) {

    String text = "";
    String desc = "";
    if (node.getText() != null) {
        text = node.getText().toString();
    }
    if (node.getContentDescription() != null) {
        desc = node.getContentDescription().toString();
    }

    if (this.checkValue != null) {

        return text.equals(this.checkValue) || desc.equals(this.checkValue);

    } else if (this.checkPattern != null) {
        return this.checkPattern.matcher(text).matches() || this.checkPattern.matcher(desc).matches();

    }
    return false;
}
 
Example 2
Source File: MouseAccessibilityService.java    From android-mouse-cursor with MIT License 6 votes vote down vote up
private static void logNodeHierachy(AccessibilityNodeInfo nodeInfo, int depth) {
    Rect bounds = new Rect();
    nodeInfo.getBoundsInScreen(bounds);

    StringBuilder sb = new StringBuilder();
    if (depth > 0) {
        for (int i=0; i<depth; i++) {
            sb.append("  ");
        }
        sb.append("\u2514 ");
    }
    sb.append(nodeInfo.getClassName());
    sb.append(" (" + nodeInfo.getChildCount() +  ")");
    sb.append(" " + bounds.toString());
    if (nodeInfo.getText() != null) {
        sb.append(" - \"" + nodeInfo.getText() + "\"");
    }
    Log.v(TAG, sb.toString());

    for (int i=0; i<nodeInfo.getChildCount(); i++) {
        AccessibilityNodeInfo childNode = nodeInfo.getChild(i);
        if (childNode != null) {
            logNodeHierachy(childNode, depth + 1);
        }
    }
}
 
Example 3
Source File: AccessUtil.java    From pc-android-controller-android with Apache License 2.0 6 votes vote down vote up
private void findChildView(AccessibilityNodeInfo info, String findText) {
    String text = info.getText() + "";
    boolean isContentTxl = text.equals(findText);
    if (info.getChildCount() == 0) {
        if (!TextUtils.isEmpty(text) && isContentTxl) {
            L.e("Text:" + text + "是否" + isContentTxl + "是否2" + text.equals("通讯录"));
            performClick(info);
        }
    } else {
        for (int i = 0; i < info.getChildCount(); i++) {
            if (info.getChild(i) != null) {
                findChildView(info.getChild(i), findText);
            }
        }
    }
}
 
Example 4
Source File: peService.java    From styT with Apache License 2.0 6 votes vote down vote up
/**
 * 描述:处理新消息
 * 作者:卜俊文
 * 邮箱:[email protected]
 * 日期:2017/11/3 下午11:21
 */
private void progressNewMessage(AccessibilityEvent event) {

    if (event == null) {
        return;
    }
    AccessibilityNodeInfo source = event.getSource();
    if (source == null) {
        return;
    }
    //根据event的source里的text,来判断这个消息是否包含[QQ红包]的字眼,有的话就跳转过去
    CharSequence text = source.getText();
    if (!TextUtils.isEmpty(text) && text.toString().contains(QQConstant.QQ_ENVELOPE_KEYWORD)) {
        performViewClick(source);
    }
}
 
Example 5
Source File: IdleState.java    From WaterMonitor with Apache License 2.0 6 votes vote down vote up
/**
 * @param nodeInfo
 * @param accessibilityEvent
 * @return If from notification ,msg format :{@link Constant#MONITOR_TAG} + ":real QQ No: "+{@link Constant#MONITOR_CMD_VIDEO}
 */
private String retrieveQQNumber(AccessibilityNodeInfo nodeInfo, AccessibilityEvent accessibilityEvent) {
    if (accessibilityEvent.getEventType() == TYPE_NOTIFICATION_STATE_CHANGED) {
        Parcelable data = accessibilityEvent.getParcelableData();
        if (data instanceof Notification) {
            if (((Notification) data).tickerText != null) {
                return ((Notification) data).tickerText.toString().split(":")[1];
            }
        }
    } else {
        List<AccessibilityNodeInfo> nodeInfos = nodeInfo.findAccessibilityNodeInfosByText(MONITOR_TAG);
        if (!AppUtils.isListEmpty(nodeInfos)) {
            String tag;
            for (AccessibilityNodeInfo info : nodeInfos) {
                if (BuildConfig.DEBUG) {
                    Log.d(TAG, "retrieveQQNumber: " + info.getText());
                }
                tag = (String) info.getText();
                if (!TextUtils.isEmpty(tag) && tag.contains(MONITOR_TAG)) {
                    return tag.substring(Constant.MONITOR_TAG.length());
                }
            }
        }
    }
    return Privacy.QQ_NUMBER;
}
 
Example 6
Source File: UiObject2.java    From za-Farmer with MIT License 5 votes vote down vote up
/**
 * Set the text content by sending individual key codes.
 * @hide
 */
public void legacySetText(String text) {
    AccessibilityNodeInfo node = getAccessibilityNodeInfo();

    // Per framework convention, setText(null) means clearing it
    if (text == null) {
        text = "";
    }

    CharSequence currentText = node.getText();
    if (!text.equals(currentText)) {
        InteractionController ic = mDevice.getAutomatorBridge().getInteractionController();

        // Long click left + center
        Rect rect = getVisibleBounds();
        ic.longTapNoSync(rect.left + 20, rect.centerY());

        // Select existing text
        mDevice.wait(Until.findObject(By.descContains("Select all")), 50).click();
        // Wait for the selection
        SystemClock.sleep(250);
        // Delete it
        ic.sendKey(KeyEvent.KEYCODE_DEL, 0);

        // Send new text
        ic.sendText(text);
    }
}
 
Example 7
Source File: AccessUtil.java    From pc-android-controller-android with Apache License 2.0 5 votes vote down vote up
private void findChildView2(AccessibilityNodeInfo info, String parentText) {
        parentText = parentText + " |-- " + info.getText();
        L.d("得到控件 " + parentText);
        for (int i = 0; i < info.getChildCount(); i++) {
            AccessibilityNodeInfo child = info.getChild(i);
            if (child != null) {
//                L.d("得到子控件 " + child.getText());
                findChildView2(child, parentText + "");
            } else {
//                L.d("得到所有控件" + info.getText());
            }
        }
    }
 
Example 8
Source File: dex_smali.java    From stynico with MIT License 5 votes vote down vote up
private void getAllHongBao(AccessibilityNodeInfo info)
   {
runState = true;
//Log.i(TAG, "获取所有红包");
time = System.currentTimeMillis();
List<AccessibilityNodeInfo> list=new ArrayList<AccessibilityNodeInfo>();
//查找出当前页面所有的红包,包括手气红包和口令红包
for (String word:QQ_KEYWORD_HONGBAO)
{
    List<AccessibilityNodeInfo> infolist  = info.findAccessibilityNodeInfosByText(word);
    if (!infolist.isEmpty())
    {
	for (AccessibilityNodeInfo node:infolist)
	{
	    //这里进行过滤可点击的红包,放到后面去过滤的话感觉非常操蛋
	    if (node.getText() == null ||!node.getText().toString().equals(word) ||node.getParent().getChildCount() != 3 ||!node.getParent().findAccessibilityNodeInfosByText(QQ_KEYWORD_FAILD_CLICK).isEmpty())
		continue;
	    list.add(node);
	}
    }
}
if (list.size() == 0)
{
    runState = false;
    return ;
}
ToastUtil.show(this,list.size()+"/"+(System.currentTimeMillis() - time) + "", Toast.LENGTH_SHORT);
//Log.i(TAG, "数量>>>" + list.size() + "  获取红包耗时:" + (System.currentTimeMillis() - time) + "ms");
clickAction(list);
   }
 
Example 9
Source File: AccessibilityUtils.java    From PrivacyStreams with Apache License 2.0 5 votes vote down vote up
public static SerializedAccessibilityNodeInfo serialize(AccessibilityNodeInfo node){
    SerializedAccessibilityNodeInfo serializedNode = new SerializedAccessibilityNodeInfo();
    Rect boundsInScreen = new Rect(), boundsInParent = new Rect();
    if(node == null){
        return null;
    }
    if(node.getClassName() != null)
        serializedNode.className = node.getClassName().toString();
    node.getBoundsInScreen(boundsInScreen);
    node.getBoundsInParent(boundsInParent);

    serializedNode.boundsInScreen = boundsInScreen.flattenToString();
    serializedNode.boundsInParent = boundsInParent.flattenToString();

    if(node.getContentDescription() != null)
        serializedNode.contentDescription = node.getContentDescription().toString();

    if(node.getText() != null){
        serializedNode.text = node.getText().toString();
    }

    if(node.getViewIdResourceName() != null)
        serializedNode.viewId = node.getViewIdResourceName();

    int childCount = node.getChildCount();
    for(int i = 0; i < childCount; i ++){
        if(node.getChild(i) != null){
            serializedNode.children.add(serialize(node.getChild(i)));
        }
    }

    return serializedNode;
}
 
Example 10
Source File: AccessibilityUtils.java    From PrivacyStreams with Apache License 2.0 5 votes vote down vote up
/**
 *
 * @param nodeInfo
 * @return
 */
public static boolean isIncomingMessage(AccessibilityNodeInfo nodeInfo, Context context) {
    Rect rect = new Rect();
    nodeInfo.getBoundsInScreen(rect);

    return rect.left < UIUtils.getScreenHeight(context)
            - rect.right && nodeInfo.getText() != null;
}
 
Example 11
Source File: UiObject2.java    From JsDroidCmd with Mozilla Public License 2.0 5 votes vote down vote up
/**
 * Set the text content by sending individual key codes.
 * 
 * @hide
 */
public void legacySetText(String text) {
	AccessibilityNodeInfo node = getAccessibilityNodeInfo();

	// Per framework convention, setText(null) means clearing it
	if (text == null) {
		text = "";
	}

	CharSequence currentText = node.getText();
	if (!text.equals(currentText)) {
		InteractionController ic = mDevice.getAutomatorBridge()
				.getInteractionController();

		// Long click left + center
		Rect rect = getVisibleBounds();
		ic.longTapNoSync(rect.left + 20, rect.centerY());

		// Select existing text
		mDevice.wait(Until.findObject(By.descContains("Select all")), 50)
				.click();
		// Wait for the selection
		SystemClock.sleep(250);
		// Delete it
		ic.sendKey(KeyEvent.KEYCODE_DEL, 0);

		// Send new text
		ic.sendText(text);
	}
}
 
Example 12
Source File: UiObject.java    From JsDroidCmd with Mozilla Public License 2.0 5 votes vote down vote up
/**
 * Clears the existing text contents in an editable field.
 *
 * The {@link UiSelector} of this object must reference a UI element that is editable.
 *
 * When you call this method, the method sets focus on the editable field, selects all of its
 * existing content, and clears it by sending a DELETE key press
 *
 * @throws UiObjectNotFoundException
 * @since API Level 16
 */
public void clearTextField() throws UiObjectNotFoundException {
    Tracer.trace();
    // long click left + center
    AccessibilityNodeInfo node = findAccessibilityNodeInfo(mConfig.getWaitForSelectorTimeout());
    if(node == null) {
        throw new UiObjectNotFoundException(mUiSelector.toString());
    }
    CharSequence text = node.getText();
    // do nothing if already empty
    if (text != null && text.length() > 0) {
        if (UiDevice.API_LEVEL_ACTUAL > Build.VERSION_CODES.KITKAT) {
            setText("");
        } else {
            Bundle selectionArgs = new Bundle();
            // select all of the existing text
            selectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
            selectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT,
                    text.length());
            boolean ret = node.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
            if (!ret) {
                Log.w(LOG_TAG, "ACTION_FOCUS on text field failed.");
            }
            ret = node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, selectionArgs);
            if (!ret) {
                Log.w(LOG_TAG, "ACTION_SET_SELECTION on text field failed.");
            }
            // now delete all
            getInteractionController().sendKey(KeyEvent.KEYCODE_DEL, 0);
        }
    }
}
 
Example 13
Source File: TamicInstallService.java    From Autoinstall with Apache License 2.0 5 votes vote down vote up
/**
 * extractNode.
 * @param aAccessibilityEvent    aAccessibilityEvent
 * @param aNodeClassName         aNodeClassName
 * @param aNodeText              aNodeText
 * @return                       AccessibilityNodeInfo
 */
private AccessibilityNodeInfo extractNode(AccessibilityEvent aAccessibilityEvent, String aNodeClassName, String aNodeText) {
    List<AccessibilityNodeInfo> extractList = null;
    AccessibilityNodeInfo targetNode = null;
    AccessibilityNodeInfo rootNode;
    if((aAccessibilityEvent == null) || (aAccessibilityEvent.getSource() == null)) {
        rootNode = this.getRootInActiveWindow();
        if(rootNode != null) {
            extractList = rootNode.findAccessibilityNodeInfosByText(aNodeText);
        }
    } else {
        extractList = aAccessibilityEvent.getSource().findAccessibilityNodeInfosByText(aNodeText);
    }

    if ((extractList == null) || extractList.isEmpty()) {
        targetNode = null;
    } else {
        Iterator<AccessibilityNodeInfo> it = extractList.iterator();
        AccessibilityNodeInfo tempNode = null;
        while (it.hasNext()) {
            tempNode = it.next();

            if (!tempNode.getClassName().equals(aNodeClassName)) {
                continue;
            }

            String nodeName = (tempNode.getText() == null) ? "" : tempNode.getText().toString();

            if (!nodeName.endsWith(aNodeText)) {
                continue;
            }

            targetNode = tempNode;
            break;
        }
    }

    return targetNode;
}
 
Example 14
Source File: LaunchApp.java    From PUMA with Apache License 2.0 5 votes vote down vote up
private void compute_feature_vector(Hashtable<String, FeatureValuePair> map, AccessibilityNodeInfo node, int level) {
	int child_cnt = node.getChildCount();

	if (child_cnt > 0) {
		for (int i = 0; i < child_cnt; i++) {
			AccessibilityNodeInfo child = node.getChild(i);
			compute_feature_vector(map, child, level + 1);
		}
	} else {
		String key = node.getClassName().toString() + "@" + level;
		FeatureValuePair value;
		int size = 0;

		CharSequence text = node.getText();
		if (text != null) {
			size = text.toString().length();
		}

		if (node.getClassName().toString().equals(ImageView.class.getCanonicalName())) {
			Rect bounds = new Rect();
			node.getBoundsInScreen(bounds);
			String timestamp = new SimpleDateFormat("MM-dd'T'HH-mm-ss-SSS").format(new Date());
			size = get_imageview_size("/data/local/tmp/local/tmp/haos.png", bounds, "/data/local/tmp/local/tmp/" + key + "_" + timestamp + ".png");
		} else {
			// Util.log(node.getClassName() + " NOT " + ImageView.class.getCanonicalName());
		}

		value = map.containsKey(key) ? map.get(key) : new FeatureValuePair(0, 0);
		value.count++;
		value.size += size;
		map.put(key, value);

		// Util.log("Leaf: " + key + ", " + size);
	}
}
 
Example 15
Source File: TamicInstallService.java    From Autoinstall with Apache License 2.0 5 votes vote down vote up
/**
 * performClickActionWithFindNode.
 * @param aAccessibilityNodeInfo  aAccessibilityNodeInfo
 * @param aClassName              aClassName
 * @param aNodeTxt                aNodeTxt
 * @param isGlobal                isGlobal
 * @return                        true
 */
private boolean performClickActionWithFindNode(AccessibilityNodeInfo aAccessibilityNodeInfo, String aClassName, String aNodeTxt, boolean isGlobal) {
    if(aAccessibilityNodeInfo == null) {
        return false;
    } else {
        List<AccessibilityNodeInfo> targetList = aAccessibilityNodeInfo.findAccessibilityNodeInfosByText(aNodeTxt);
        if (targetList != null) {
            for (AccessibilityNodeInfo targetNode : targetList) {
                if (aClassName != null) {
                    String targetClassName = targetNode.getClassName() == null ? "" : targetNode.getClassName().toString();
                    if (!aClassName.equals(targetClassName)) {
                        continue;
                    }
                }

                String targetNodeText = targetNode.getText() == null ? "" : targetNode.getText().toString();
                if (!aNodeTxt.equals(targetNodeText)) {
                    continue;
                }

                if (isGlobal && !isAutoRunning) {
                    performGlobalAction(AccessibilityNodeInfo.ACTION_FOCUS);
                } else {
                    performClickAction(targetNode);
                }
                return true;
            }
        }
    }

    return false;
}
 
Example 16
Source File: NodesInfo.java    From Anti-recall with GNU Affero General Public License v3.0 5 votes vote down vote up
private static String print(AccessibilityNodeInfo nodeInfo) {

        if (nodeInfo == null)
            return "";

        CharSequence text = nodeInfo.getText();
        CharSequence description = nodeInfo.getContentDescription();
        CharSequence className = nodeInfo.getClassName();
        CharSequence packageName = nodeInfo.getPackageName();
        boolean focusable = nodeInfo.isFocusable();
        boolean clickable = nodeInfo.isClickable();
        Rect rect = new Rect();
        nodeInfo.getBoundsInScreen(rect);
        String viewId = nodeInfo.getViewIdResourceName();

        return "| "
                + "text: " + text + " \t"
                + "description: " + description + " \t"
                + String.format("%-40s", "ID: " + viewId) + " \t"
                + String.format("%-40s", "class: " + className) + " \t"
                + String.format("%-30s", "location: " + rect) + " \t"
//                + "focusable: " + focusable + " \t"
//                + "clickable: " + clickable + " \t"
//                + String.format("%-30s", "package: " + packageName) + " \t"
                ;

    }
 
Example 17
Source File: UiObject.java    From za-Farmer with MIT License 5 votes vote down vote up
/**
 * Clears the existing text contents in an editable field.
 *
 * The {@link UiSelector} of this object must reference a UI element that is editable.
 *
 * When you call this method, the method sets focus on the editable field, selects all of its
 * existing content, and clears it by sending a DELETE key press
 *
 * @throws UiObjectNotFoundException
 * @since API Level 16
 */
public void clearTextField() throws UiObjectNotFoundException {
    Tracer.trace();
    // long click left + center
    AccessibilityNodeInfo node = findAccessibilityNodeInfo(mConfig.getWaitForSelectorTimeout());
    if(node == null) {
        throw new UiObjectNotFoundException(mUiSelector.toString());
    }
    CharSequence text = node.getText();
    // do nothing if already empty
    if (text != null && text.length() > 0) {
        if (UiDevice.API_LEVEL_ACTUAL > Build.VERSION_CODES.KITKAT) {
            setText("");
        } else {
            Bundle selectionArgs = new Bundle();
            // select all of the existing text
            selectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
            selectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT,
                    text.length());
            boolean ret = node.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
            if (!ret) {
                Log.w(LOG_TAG, "ACTION_FOCUS on text field failed.");
            }
            ret = node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, selectionArgs);
            if (!ret) {
                Log.w(LOG_TAG, "ACTION_SET_SELECTION on text field failed.");
            }
            // now delete all
            getInteractionController().sendKey(KeyEvent.KEYCODE_DEL, 0);
        }
    }
}
 
Example 18
Source File: TimeCatMonitorService.java    From timecat with Apache License 2.0 4 votes vote down vote up
private synchronized void getText(AccessibilityEvent event) {
        LogUtil.d(TAG, "getText:" + event);
        if (!monitorClick || event == null) {
            return;
        }
        if (showFloatView && !isRun) {
            return;
        }
        int type = getClickType(event);
        CharSequence className = event.getClassName();
        if (mWindowClassName == null) {
            return;
        }
        if (mWindowClassName.toString().startsWith("com.time.timecat")) {
            //自己的应用不监控
            return;
        }
        if (mCurrentPackage.equals(event.getPackageName())) {
            if (type != mCurrentType) {
                //点击方式不匹配,直接返回
                return;
            }
        } else {
            //包名不匹配,直接返回
            return;
        }
        if (className == null || className.equals("android.widget.EditText")) {
            //输入框不监控
            return;
        }
        if (onlyText) {
            //onlyText方式下,只获取TextView的内容
            if (!className.equals("android.widget.TextView")) {
                if (!hasShowTipToast) {
                    ToastUtil.i(R.string.toast_tip_content);
                    hasShowTipToast = true;
                }
                return;
            }
        }
        AccessibilityNodeInfo info = event.getSource();
        if (info == null) {
            return;
        }
        CharSequence txt = info.getText();
        if (TextUtils.isEmpty(txt) && !onlyText) {
            //非onlyText方式下获取文字更多,但是可能并不是想要的文字
            //比如系统短信页面需要这样才能获取到内容。
            List<CharSequence> txts = event.getText();
            if (txts != null) {
                StringBuilder sb = new StringBuilder();
                for (CharSequence t : txts) {
                    sb.append(t);
                }
                txt = sb.toString();
            }
        }
        if (!TextUtils.isEmpty(txt)) {
            if (txt.length() <= 2) {
                //对于太短的词进行屏蔽,因为这些词往往是“发送”等功能按钮,其实应该根据不同的activity进行区分
                if (!hasShowTooShortToast) {
                    ToastUtil.w(R.string.too_short_to_split);
                    hasShowTooShortToast = true;
                }
                return;
            }
            Intent intent = new Intent(this, TimeCatActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(TimeCatActivity.TO_SPLIT_STR, txt.toString());
//            startActivity(intent);
            //放到ArcTipViewController中触发试试
            ArcTipViewController.getInstance().showTipViewForStartActivity(intent);
        }
    }
 
Example 19
Source File: TaskBackService.java    From codeexamples-android with Eclipse Public License 1.0 4 votes vote down vote up
/**
 * Processes an AccessibilityEvent, by traversing the View's tree and
 * putting together a message to speak to the user.
 */
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (!mTextToSpeechInitialized) {
        Log.e(LOG_TAG, "Text-To-Speech engine not ready.  Bailing out.");
        return;
    }

    // This AccessibilityNodeInfo represents the view that fired the
    // AccessibilityEvent. The following code will use it to traverse the
    // view hierarchy, using this node as a starting point.
    //
    // NOTE: Every method that returns an AccessibilityNodeInfo may return null,
    // because the explored window is in another process and the
    // corresponding View might be gone by the time your request reaches the
    // view hierarchy.
    AccessibilityNodeInfo source = event.getSource();
    if (source == null) {
        return;
    }

    // Grab the parent of the view that fired the event.
    AccessibilityNodeInfo rowNode = getListItemNodeInfo(source);
    if (rowNode == null) {
        return;
    }

    // Using this parent, get references to both child nodes, the label and the checkbox.
    AccessibilityNodeInfo labelNode = rowNode.getChild(0);
    if (labelNode == null) {
        rowNode.recycle();
        return;
    }

    AccessibilityNodeInfo completeNode = rowNode.getChild(1);
    if (completeNode == null) {
        rowNode.recycle();
        return;
    }

    // Determine what the task is and whether or not it's complete, based on
    // the text inside the label, and the state of the check-box.
    if (rowNode.getChildCount() < 2 || !rowNode.getChild(1).isCheckable()) {
        rowNode.recycle();
        return;
    }

    CharSequence taskLabel = labelNode.getText();
    final boolean isComplete = completeNode.isChecked();

    String completeStr = null;
    if (isComplete) {
        completeStr = getString(R.string.task_complete);
    } else {
        completeStr = getString(R.string.task_not_complete);
    }

    String taskStr = getString(R.string.task_complete_template, taskLabel, completeStr);
    StringBuilder utterance = new StringBuilder(taskStr);

    // The custom ListView added extra context to the event by adding an
    // AccessibilityRecord to it. Extract that from the event and read it.
    final int records = event.getRecordCount();
    for (int i = 0; i < records; i++) {
        AccessibilityRecord record = event.getRecord(i);
        CharSequence contentDescription = record.getContentDescription();
        if (!TextUtils.isEmpty(contentDescription )) {
            utterance.append(SEPARATOR);
            utterance.append(contentDescription);
        }
    }

    // Announce the utterance.
    mTts.speak(utterance.toString(), TextToSpeech.QUEUE_FLUSH, null);
    Log.d(LOG_TAG, utterance.toString());
}
 
Example 20
Source File: QQClient.java    From Anti-recall with GNU Affero General Public License v3.0 4 votes vote down vote up
protected void parser(AccessibilityNodeInfo group) {
        if (group.getChildCount() == 0)
            return;
        int headIconPos = 0;
        int messagePos = 0;
        subName = "";
        message = "";
        isRecalledMsg = false;

        for (int j = 0; j < group.getChildCount(); j++) {
            AccessibilityNodeInfo child = group.getChild(j);
            if (child == null) {
                Log.d(TAG, "parser: child is null, continue");
                continue;
            }
            String nodeId = child.getViewIdResourceName();
            if (nodeId == null) {
                Log.d(TAG, "parser: node ID is null, continue");
                continue;
            }
            switch (nodeId) {
                case IdHeadIcon:
                    //头像图标
                    headIconPos = j;
                    break;
                case IdChatItem:
                    switch (child.getClassName() + "") {
                        case "android.widget.RelativeLayout":
                            if (child.getChildCount() != 0) {
                                if (child.getContentDescription() != null) {
                                    redPegNode = child;
                                    message = "红包";
                                    //红包或者是分享
                                    Log.d(TAG, "content_layout: 红包");
                                }
                            } else {
                                message = "[图片]";
                                Log.d(TAG, "content_layout: 图片");
                            }
                            break;
                        case "android.widget.LinearLayout": {
                            if (child.getChildCount() == 2) {
                                AccessibilityNodeInfo child1 = child.getChild(0);
                                AccessibilityNodeInfo child2 = child.getChild(1);
                                if (child1 != null && "android.widget.RelativeLayout".contentEquals(child1.getClassName())) {
                                    if (child2 != null && "android.widget.TextView".contentEquals(child2.getClassName())) {
//                                        message = "回复 " + child1.getText() + ": \n" + child2.getText();
                                        message = child2.getText() + "";
                                    }
                                }
                            }
                            Log.d(TAG, "content_layout: 回复消息");
                        }
                        break;
                        case "android.widget.TextView": {
                            message = child.getText() + "";
                            Log.v(TAG, "content_layout: 普通文本");
                        }
                        break;
                    }
                    messagePos = j;
                    break;
                case IdNickName:
                    subName = child.getText() + "";
                    break;
                case IdGrayBar:
                        message = child.getText() + "";
                    Log.w(TAG, "parser: message: " + message);
                        int indexOfRecall = message.indexOf(RECALL);
                        if (indexOfRecall >= 0) {
                            isRecalledMsg = true;
                            subName = message.substring(0, indexOfRecall);
                            message = RECALL;
                            if ("对方".equals(subName))
                                subName = title;
                            else if ("你".equals(subName))
                                subName = "我";
                            Log.v(TAG, "content_layout: 灰底文本");
                        }
                    Log.w(TAG, "parser: " + indexOfRecall + " " + RECALL + " " + message);
                    break;
            }
        }
        if (messagePos < headIconPos)
            // 消息在头像左边
            subName = "我";
        else if ("".equals(subName))
            // 两人聊天时 没有subName
            subName = title;
        Log.v(TAG, "parser: " + title + " - " + subName + " : " + message);
    }