首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓O: AccessibilityService

安卓O: AccessibilityService
EN

Stack Overflow用户
提问于 2017-05-18 18:19:34
回答 1查看 2K关注 0票数 0

我尝试在Android O中使用AccessibilityService,但它没有创建此服务。

清单:

代码语言:javascript
复制
<service
        android:name=".AccessService"
        android:label="@string/app_name"
        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>

XML配置:

代码语言:javascript
复制
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
                   android:description="@string/app_name"
                   android:accessibilityEventTypes="typeAllMask"
                   android:accessibilityFlags="flagRequestFilterKeyEvents|flagIncludeNotImportantViews"
                   android:accessibilityFeedbackType="feedbackAllMask"
                   android:notificationTimeout="100"
                   android:canRetrieveWindowContent="true"
                   android:canRequestFilterKeyEvents="true"
                   android:settingsActivity="com.example.test.MainActivity"
/>

我为扩展的AccessibilityService类的所有方法添加了日志输出,但是onCreate从未被调用过。我可以在Android设置中激活该服务,并将其绑定到两个音量按钮,如果我同时按下这两个按钮,他总是说现在激活了。它没有说禁用或类似的东西。Android设置页面显示其处于活动状态。

我的AccessibilityService类只有日志输出。我在这节课上什么也没做。

我错过了什么吗?在Android O中还有什么是我必须做的吗?我基于本教程进行了尝试:https://developer.android.com/guide/topics/ui/accessibility/services.html

我想接住长按音量键。

EN

回答 1

Stack Overflow用户

发布于 2017-05-21 17:37:53

不清楚你说它没有创建服务是什么意思,因为你还说Android设置页面识别它是活动的。

我尝试创建一个可访问性服务来在Android O上运行它,它似乎起作用了。

这是我的服务,正如你所说的,你的服务的行为,只是记录:

代码语言:javascript
复制
public class LoggingA11yService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.d("!!!", "onAccessibilityEvent: " + event);
    }

    @Override
    public void onInterrupt() {
        Log.d("!!!", "onInterrupt");
    }

}

有必要在清单中声明此服务,并在XML中为其提供配置(一些属性可以通过编程方式进行配置,但所有属性都可以通过XML进行配置,因此这是首选方法):

代码语言:javascript
复制
<application>

    <service android:name=".LoggingA11yService"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:label="@string/accessibility_service_label">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibilityservice" />
    </service>

    <activity ...

</application>

@xml/accessibilityservice

代码语言:javascript
复制
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_service_description"
    android:notificationTimeout="100" />

然后,只需通过导航到设置>可访问性> LoggingA11yService > toggle来启用服务,就可以激活它。

我可以在logcat中看到我使用设备时的输出,例如:

代码语言:javascript
复制
05-21 10:34:25.848 15998-15998/com.novoda.androidskeleton D/!!!:
onAccessibilityEvent: EventType: TYPE_WINDOW_STATE_CHANGED;
EventTime: 113655863; PackageName: com.android.settings;
MovementGranularity: 0; Action: 0 [ ClassName: com.android.settings.SubSettings;
Text: [Label Logging A11y Service]; ContentDescription: null;
ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true;
IsPassword: false; IsChecked: false; IsFullScreen: true;
Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1;
ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1;
AddedCount: -1; RemovedCount: -1; ParcelableData: null ];
recordCount: 0

注意,文档说如果有多个服务可以处理相同的事件,那么它们只会在服务提供不同类型的反馈的情况下将事件发送给所有服务。否则,注册的第一个服务将收到事件-通过在测试您的服务时禁用任何其他可访问性服务来检查这是否不是您的情况。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44045059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档