0

我正在使用 android Accessibility 尝试获取 url,但 url 在文本中没有 http 或 https 获取 url 没有使用 Android 10 和最新的 chrome 浏览器的方案。

一切正常,只是在没有 http 或 https 的情况下获取 url,例如 amazon.in/gp/help/customer/display.html/ref=aw?ie=UTF8&nodeId=200545940 由于哪个代码不起作用

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:packageNames="com.android.chrome"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:notificationTimeout="0"
android:canRetrieveWindowContent="true"
android:canRequestFilterKeyEvents="true"
android:settingsActivity="" />

清单文件

        <service
        android:name=".MyAccessibilityService"
        android:label="Extension Demo"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>

        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
    </service>



public class MyAccessibilityService extends AccessibilityService {

  @Override
  public void onAccessibilityEvent(AccessibilityEvent event) {

    AccessibilityNodeInfo source = event.getSource();

    if (source == null)
    return;

    final String packageName = String.valueOf(source.getPackageName());

    // Add browser package list here (comma seperated values)
    String BROWSER_LIST = "";

    List<String> browserList 
      = Arrays.asList(BROWSER_LIST.split(",\\s*"));
    if (event.getEventType() 
      == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
      if (!browserList.contains(packageName)) {
        return;
      }
    }

    if (browserList.contains(packageName)) {
      try {
        // App opened is a browser.
        // Parse urls in browser.
        if (AccessibilityEvent
          .eventTypeToString(event.getEventType())
          .contains("WINDOW")) {
          AccessibilityNodeInfo nodeInfo = event.getSource();
          getUrlsFromViews(nodeInfo);
        }
      } catch(StackOverflowError ex){
        ex.printStackTrace();
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    } 
  }

  /**
  * Method to loop through all the views and try to find a URL.
  * @param info
  */
  public void getUrlsFromViews(AccessibilityNodeInfo info) {  

    try {
      if (info == null) 
        return;

      if (info.getText() != null && info.getText().length() > 0) {

        String capturedText = info.getText().toString();

            if (capturedText.contains("https://") 
              || capturedText.contains("http://")) {
              if (!previousUrl.equals(capturedText)) {
                // Do something with the url.
                previousUrl = capturedText;
              }
            }
      }

      for (int i = 0; i < info.getChildCount(); i++) {
        AccessibilityNodeInfo child = info.getChild(i);
        getUrlsFromViews(child);
        if(child != null){
          child.recycle();
        }
      }
    } catch(StackOverflowError ex){
      ex.printStackTrace();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  @Override
  public void onInterrupt() {

  }
 }
4

0 回答 0