通过AccessibilityService获取Chrome当前网址

时间:2018-11-07 09:20:37

标签: android google-chrome kotlin accessibilityservice

我正在尝试创建一个包含chrome访问过的网站记录器功能的应用

这是我的AccessibilityService

class CoreService : AccessibilityService(){

override fun onInterrupt() {
    return
}

var TAG  = "app:"

override fun onServiceConnected() { 
    Log.i(TAG,"Connected")
}

override fun onAccessibilityEvent(event: AccessibilityEvent) {
        Log.i(TAG,"onAccessibilityEvent")
        onChromeActivity(getRootInActiveWindow())
}

fun onChromeActivity(nodeInfo: AccessibilityNodeInfo) {

    var result = "|"
    var arra = nodeInfo.findAccessibilityNodeInfosByText("http");

    for (i in 0 until arra.size) {
        result += "\n" + arra.get(i).toString();
    }
    Log.i(TAG,"result: $result")
} 

}

xml配置

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews|flagRequestTouchExplorationMode|flagRequestEnhancedWebAccessibility|flagReportViewIds|flagRetrieveInteractiveWindows"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:notificationTimeout="0"
android:canRetrieveWindowContent="true"
android:packageNames="com.android.chrome"
android:description="@string/desc"/>

到目前为止,我正在获取此日志猫

  

2018-11-07 17:08:15.516 19631-19631 / com.jmg21.omgi I / app ::结果:|       android.view.accessibility.AccessibilityNodeInfo@8000ccce; boundsInParent:Rect(0,0-681,131); boundsInScreen:Rect(115,71-   796,202); packageName:com.android.chrome;班级名称:   android.widget.EditText;文字:https://www.google.com;错误:null;   maxTextLength:-1; contentDescription:null; viewIdResName:   com.android.chrome:id/url_bar;可检查:false;检查:错误;   专注:真实;重点:假;选择:错误; clickable:true;   longClickable:true; contextClickable:false;已启用:true;密码:   假;可滚动:false;动作:依此类推...

问题是:

1。如果我尝试去其他站点,我只会一次得到这个

2。我无法获取网址

请帮助并提前谢谢!

2 个答案:

答案 0 :(得分:0)

response to a similar question对事件本身使用深度优先搜索,而不是获取活动窗口的根。

我现在正在使用此代码,它确实可以成功获取每个访问的站点的URL。 不过,如果您想更快地解析节点(每个事件的DFS确实会占用大量时间和资源),则可以筛选特定事件,例如“ TYPE_VIEW_TEXT ...”,因为该事件会随着用户在Chrome中输入而触发多功能框,您无需等待页面加载。

答案 1 :(得分:0)

尝试添加typeWindowContentChanged可访问性事件类型:

android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"