Android 如何获取当前Whatsapp窗口的名称';辅助功能服务中的标题栏?

Android 如何获取当前Whatsapp窗口的名称';辅助功能服务中的标题栏?,android,accessibility,accessibilityservice,Android,Accessibility,Accessibilityservice,我正在为Whatsapp提供无障碍服务。每当用户按下输入框时,我想知道当前的标题栏,其中通常有收件人whatsapp用户或whatsapp组的名称: 我对获取字符串testuser 以下是我的xml: <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeViewClicked|typeViewFo

我正在为Whatsapp提供无障碍服务。每当用户按下输入框时,我想知道当前的标题栏,其中通常有收件人whatsapp用户或whatsapp组的名称:

我对获取字符串
testuser

以下是我的xml:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
    android:packageNames="com.whatsapp"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
    android:canRetrieveWindowContent="true" />
我尝试获取当前窗口或父窗口并检查其标题,两者似乎都为空:

AccessibilityNodeInfo currentNode = event.getSource();
AccessibilityNodeInfo parentNode = nodeInfo.getParent();
AccessibilityWindowInfo currentWindow = currentNode.getWindow();
AccessibilityWindowInfo parentWindow = parentNode.getWindow();
// currentWindow.getTitle();
// parentWindow.getTitle();

我已经编写了一个库来帮助使用AccessibilityNodeInfos和其他Android AccessibilityAPI进行工作。几乎完成了,需要记录在案。但是,使用此库,您可以这样完成:

在主服务中(允许访问根辅助功能节点),执行以下操作

A11yNodeInfo nodeInfo = A11yNodeInfo.wrap(getRootInActiveWindow());

A11yNodeInfo result = nodeInfo.visit(new A11yNodeInfo.OnVisitListener() {
   @Override
   public boolean onVisit(A11yNodeInfo nodeInfo) {
       A11yNodeInfoMatcher matcher = new A11yNodeInfoMatcher();
       //Add properties to the matcher as needed.  I'm just guessing here!

       return matcher.matches(nodeInfo);
   }
});
如果要查看该元素的可访问性属性,还可以打印整个可访问性树:

Log.d("Tag", A11yNodeInfo.wrap(getRootInActiveWindow).toViewHeirarchy());
这对我很有效:

AccessibilityNodeInfo nodeInfo = event.getSource();

try
{
 List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = nodeInfo.findAccessibilityNodeInfosByViewId("com.whatsapp:id/conversation_contact_name");

 if (findAccessibilityNodeInfosByViewId.size() > 0)
 {
  AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0);

  String contactName = parent.getText().toString();

  if (contactName != null && !contactName.isEmpty()) // do your stuff here, contactName contains the chat contact name!

 }
}
catch(Exception contactName) {}

我想你忘了链接到你的图书馆了
AccessibilityNodeInfo nodeInfo = event.getSource();

try
{
 List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = nodeInfo.findAccessibilityNodeInfosByViewId("com.whatsapp:id/conversation_contact_name");

 if (findAccessibilityNodeInfosByViewId.size() > 0)
 {
  AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0);

  String contactName = parent.getText().toString();

  if (contactName != null && !contactName.isEmpty()) // do your stuff here, contactName contains the chat contact name!

 }
}
catch(Exception contactName) {}
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds"
    android:canRetrieveWindowContent="true"
    android:packageNames="com.whatsapp"
/>
@Override
public void onServiceConnected()
{
 AccessibilityServiceInfo info=getServiceInfo();
 info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
 this.setServiceInfo(info);
}