如何绕过AccessibilityService中的TouchExplorationMode?

时间:2017-02-14 16:47:48

标签: android accessibilityservice

现在已经坚持了一段时间......

我有AccessibilityService我用来阅读屏幕内容。其中一些内容隐藏在ListView中。如果我在AccessibilityService上启用TouchExplorationMode并触摸listView中的项目,我可以看到内容。

然而,如果启用此选项,则所有单个触摸手势都会被选为悬停手势。我发现您无法以编程方式启用和禁用此选项。有没有办法将悬停事件转换回触摸事件?

我发现了converting hover to touch using Views。但是我需要相同的东西,但是从没有视图的AccessibilityService开始。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您无法使用TouchExplorationMode直接将悬停事件传递到应用程序窗口。这不可能。但是,是什么让您认为您无法以编程方式启用和禁用TouchExplorationMode ???这将是错误的。这是你如何做到的。

public class YourA11yService extends AccessibilityService {

    private void enableTouchExploration() {
        AccessibilityServiceInfo info = mInstance.getServiceInfo();

        info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;

        mInstance.setServiceInfo(info);
    }

    private void disableTouchExploration() {
        AccessibilityServiceInfo serviceInfo = mInstance.getServiceInfo();

        serviceInfo.flags &= ~AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;

        mInstance.setServiceInfo(serviceInfo);
    }

}

虽然您不需要触摸探索模式来查找此内容。只需在当前窗口内容中找到列表视图即可。为什么你必须触摸它才能访问它?

编辑: 的AndroidManifest.xml

    ...
    <service
        android:name=".A11yService"
        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/service_config" />

    <
    ...

ServiceConfig.xml(R.xml.service_config)

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
   ...
   android:canRequestTouchExplorationMode="true"
   android:accessibilityFlags="flagIncludeNotImportantViews"
   .../>

注意:我已经删除了很多脚手架和其他基本属性,将其煮沸至最低设置以使其工作。显然,这些文件还有其他重要方面!