Android Clickable On屏幕文字

Jay*_*yce 8 android onclick

我很好奇,前几天我看到这个应用程序允许它打开其他应用程序并自动为您设置某些功能.我已经意识到它必须使用某种类型的屏幕点击功能,但我似乎找不到任何类似这样的文档.例如,如果我们知道来自其他应用程序的屏幕文本是"就绪",是否有办法阅读该文本,并可能做类似的事情:

protected void processText(String text)
{
  if (text.contains("Ready"))
      // click the ready text
}
Run Code Online (Sandbox Code Playgroud)

Abr*_* TS 4

我已经使用AccessibilityService. 不过,它仅在 API 级别 >= 16 上才能正常工作。

你需要延长AccessibilityService. 例如,此类将获取 USSD 响应文本并关闭对话框。

// ....
public class UssdAccessibilityService extends AccessibilityService {
    public UssdAccessibilityService() {
    }

    @TargetApi(16)
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (!"com.android.phone".equalsIgnoreCase((String)event.getPackageName())){
            // In this example we are only interested in events comming
            // from "com.android.phone" package
            event.recycle();
            return;
        }

        String className = (String)event.getClassName();
        if (className == null || (!className.contains("AlertDialog") && !className.contains("AlertDialog"))){
            // Class is not an USSD dialog
            event.recycle();
            return;
        }

        AccessibilityNodeInfo source = event.getSource();
        if (source == null) {
            // getSource() is annotated @Nullable, so we do this to be
            // safe just in case
            event.recycle();
            return;
        }

        AccessibilityNodeInfo acceptButton = null;
        String ussdText = null;

        int childCount = source.getChildCount();
        for (int i = 0; i < childCount; i++){
            AccessibilityNodeInfo current = source.getChild(i);
            if (current == null)
                continue;

            String currentText = (String)current.getText();
            if (current.isClickable()){
                // In the case of USSD dialogs, there is only one clickable.
                // May be necessary to do more robust search in other scenarios
                acceptButton = current;
                continue;
            }

            ussdText = currentText;

            current.recycle();
        }

        if (ussdText!= null) {
            if (acceptButton != null)
                acceptButton.performAction(AccessibilityNodeInfo.ACTION_CLICK);

        }

        source.recycle();
        event.recycle();
    }

    // ....
}
Run Code Online (Sandbox Code Playgroud)

您必须在清单中声明无障碍服务<application>

<service
        android:name=".UssdAccessibilityService"
        android:enabled="true"
        android:label="Read USSD codes and dismiss"
        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>
Run Code Online (Sandbox Code Playgroud)

res/xml在创建下accessibility_service_config.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:packageNames="com.android.phone,com.ats.android.activationcodebot"
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    />
Run Code Online (Sandbox Code Playgroud)

当然,您必须根据自己的需要调整此代码。

最后,您必须在 Android 中的“设置”>“辅助功能”中手动启用辅助功能服务(或要求用户执行此操作)。

阅读更多...开发无障碍服务